├── .github └── workflows │ ├── Documentation.yml │ └── swift.yml ├── .gitignore ├── CHANGELOG ├── CONTRIBUTING.md ├── Gemfile ├── Gemfile.lock ├── LICENSE.md ├── Podfile ├── README.md ├── Resources ├── adjust.png ├── app-stoer-black.png └── preview.png ├── colorful-room.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── colorful-room.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ ├── WorkspaceSettings.xcsettings │ └── swiftpm │ └── Package.resolved ├── colorful-room ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-1024.png │ │ ├── Icon-120.png │ │ ├── Icon-152.png │ │ ├── Icon-167.png │ │ ├── Icon-180.png │ │ ├── Icon-20.png │ │ ├── Icon-29.png │ │ ├── Icon-40.png │ │ ├── Icon-58.png │ │ ├── Icon-60.png │ │ ├── Icon-76.png │ │ ├── Icon-80.png │ │ └── Icon-87.png │ ├── Contents.json │ ├── adjustment │ │ ├── Contents.json │ │ ├── ant-rotate-left.imageset │ │ │ ├── Contents.json │ │ │ └── ant-rotate-left.png │ │ ├── crop.imageset │ │ │ ├── Contents.json │ │ │ └── crop.png │ │ ├── flip.imageset │ │ │ ├── Contents.json │ │ │ └── flip.png │ │ ├── perspective.imageset │ │ │ ├── Contents.json │ │ │ └── perspective.png │ │ ├── rotate-right.imageset │ │ │ ├── Contents.json │ │ │ └── rotate-right.png │ │ └── skew-less.imageset │ │ │ ├── Contents.json │ │ │ └── skew-less.png │ ├── buttons │ │ ├── Contents.json │ │ ├── adjustment-highlight.imageset │ │ │ ├── Contents.json │ │ │ └── adjustment-highlight.png │ │ ├── adjustment.imageset │ │ │ ├── Contents.json │ │ │ └── adjustment.png │ │ ├── edit-color-highlight.imageset │ │ │ ├── Contents.json │ │ │ └── edit-color-highlight.png │ │ ├── edit-color.imageset │ │ │ ├── Contents.json │ │ │ └── edit-color.png │ │ ├── edit-effect.imageset │ │ │ ├── Contents.json │ │ │ └── edit-effect.png │ │ ├── edit-lut-highlight.imageset │ │ │ ├── Contents.json │ │ │ └── edit-lut-highlight.png │ │ ├── edit-lut.imageset │ │ │ ├── Contents.json │ │ │ └── edit-lut.png │ │ ├── edit-recipe-highlight.imageset │ │ │ ├── Contents.json │ │ │ └── edit-recipe-highlight.png │ │ ├── edit-recipe.imageset │ │ │ ├── Contents.json │ │ │ └── edit-recipe.png │ │ ├── icon-download.imageset │ │ │ ├── Contents.json │ │ │ └── icon-download.png │ │ ├── icon-lut.imageset │ │ │ ├── Contents.json │ │ │ └── icon-lut.png │ │ ├── icon-photo-add.imageset │ │ │ ├── Contents.json │ │ │ └── icon-photo-add.png │ │ └── icon-undo.imageset │ │ │ ├── Contents.json │ │ │ └── icon-undo.png │ ├── colors │ │ ├── Contents.json │ │ ├── accent.colorset │ │ │ └── Contents.json │ │ ├── background.colorset │ │ │ └── Contents.json │ │ ├── bronze.colorset │ │ │ └── Contents.json │ │ ├── button-dark.colorset │ │ │ └── Contents.json │ │ ├── divider.colorset │ │ │ └── Contents.json │ │ ├── gold.colorset │ │ │ └── Contents.json │ │ ├── gray-dark.colorset │ │ │ └── Contents.json │ │ ├── gray-light.colorset │ │ │ └── Contents.json │ │ ├── gray.colorset │ │ │ └── Contents.json │ │ ├── panel.colorset │ │ │ └── Contents.json │ │ ├── primary.colorset │ │ │ └── Contents.json │ │ └── sliver.colorset │ │ │ └── Contents.json │ ├── edit-buttons │ │ ├── Contents.json │ │ ├── brightness.imageset │ │ │ ├── Contents.json │ │ │ └── brightness.png │ │ ├── contrast.imageset │ │ │ ├── Contents.json │ │ │ └── contrast.png │ │ ├── fade.imageset │ │ │ ├── Contents.json │ │ │ └── fade.png │ │ ├── hls.imageset │ │ │ ├── Contents.json │ │ │ └── hls.png │ │ ├── saturation.imageset │ │ │ ├── Contents.json │ │ │ └── saturation.png │ │ ├── temperature.imageset │ │ │ ├── Contents.json │ │ │ └── white-balance.png │ │ └── tone.imageset │ │ │ ├── Contents.json │ │ │ └── tone.png │ ├── images │ │ ├── Contents.json │ │ ├── carem.imageset │ │ │ ├── Contents.json │ │ │ └── carem.jpg │ │ ├── intro-image.imageset │ │ │ ├── Contents.json │ │ │ └── intro-image.png │ │ └── sample-image.imageset │ │ │ ├── Contents.json │ │ │ └── sample-image.png │ ├── luts │ │ ├── Contents.json │ │ ├── cinematic │ │ │ ├── Contents.json │ │ │ ├── cinematic-1.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-1.png │ │ │ ├── cinematic-10.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-10.png │ │ │ ├── cinematic-2.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-2.png │ │ │ ├── cinematic-3.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-3.png │ │ │ ├── cinematic-4.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-4.png │ │ │ ├── cinematic-5.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-5.png │ │ │ ├── cinematic-6.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-6.png │ │ │ ├── cinematic-7.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-7.png │ │ │ ├── cinematic-8.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-8.png │ │ │ └── cinematic-9.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cinematic-9.png │ │ ├── film │ │ │ ├── Contents.json │ │ │ ├── film-1.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── film-1.png │ │ │ ├── film-2.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── film-2.png │ │ │ └── film-3.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── film-3.png │ │ ├── lut-normal.imageset │ │ │ ├── Contents.json │ │ │ └── lut.jpg │ │ ├── selfie good skin │ │ │ ├── Contents.json │ │ │ ├── selfie-1.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-1.png │ │ │ ├── selfie-10.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-10.png │ │ │ ├── selfie-11.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-11.png │ │ │ ├── selfie-12.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-12.png │ │ │ ├── selfie-2.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-2.png │ │ │ ├── selfie-3.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-3.png │ │ │ ├── selfie-4.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-4.png │ │ │ ├── selfie-5.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-5.png │ │ │ ├── selfie-6.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-6.png │ │ │ ├── selfie-7.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-7.png │ │ │ ├── selfie-8.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-8.png │ │ │ └── selfie-9.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── selfie-9.png │ │ └── tan │ │ │ ├── Contents.json │ │ │ ├── lut-1.imageset │ │ │ ├── 01.png │ │ │ └── Contents.json │ │ │ ├── lut-10.imageset │ │ │ ├── 10.png │ │ │ └── Contents.json │ │ │ ├── lut-2.imageset │ │ │ ├── 02.png │ │ │ └── Contents.json │ │ │ ├── lut-3.imageset │ │ │ ├── 03.png │ │ │ └── Contents.json │ │ │ ├── lut-4.imageset │ │ │ ├── 04.png │ │ │ └── Contents.json │ │ │ ├── lut-5.imageset │ │ │ ├── 05.png │ │ │ └── Contents.json │ │ │ ├── lut-6.imageset │ │ │ ├── 06.png │ │ │ └── Contents.json │ │ │ ├── lut-7.imageset │ │ │ ├── 07.png │ │ │ └── Contents.json │ │ │ ├── lut-8.imageset │ │ │ ├── 08.png │ │ │ └── Contents.json │ │ │ └── lut-9.imageset │ │ │ ├── 09.png │ │ │ └── Contents.json │ └── ui │ │ ├── Contents.json │ │ ├── emoji-support.imageset │ │ ├── Contents.json │ │ └── emoji-support.png │ │ ├── icon-bronze.imageset │ │ ├── Contents.json │ │ └── icon-bronze.png │ │ ├── icon-gold.imageset │ │ ├── Contents.json │ │ └── icon-gold.png │ │ ├── icon-heart.imageset │ │ ├── Contents.json │ │ └── icon-heart.png │ │ ├── icon-silver.imageset │ │ ├── Contents.json │ │ └── icon-silver.png │ │ └── pattern-top.imageset │ │ ├── Contents.json │ │ └── pattern-top.png ├── ContentView.swift ├── Info.plist ├── Persistence.swift ├── PhotoEditor │ ├── Components │ │ ├── Controls │ │ │ ├── ClarityControl.swift │ │ │ ├── ColorControl.swift │ │ │ ├── ColorCubeControl.swift │ │ │ ├── ContrastControl.swift │ │ │ ├── ExposureControl.swift │ │ │ ├── FadeControl.swift │ │ │ ├── GaussianBlurControl.swift │ │ │ ├── HLS │ │ │ │ ├── ColorSelectButton.swift │ │ │ │ └── HLSControl.swift │ │ │ ├── HighlightsControl.swift │ │ │ ├── SaturationControl.swift │ │ │ ├── ShadowsControl.swift │ │ │ ├── SharpenControl.swift │ │ │ ├── TemperatureControl.swift │ │ │ ├── ToneControl.swift │ │ │ ├── VignetteControl.swift │ │ │ └── WhiteBalanceControl.swift │ │ ├── EditMenuView.swift │ │ ├── FilterMenuUI.swift │ │ ├── LutMenuUI.swift │ │ ├── RecipeMenuUI.swift │ │ ├── UI │ │ │ ├── ButtonView.swift │ │ │ ├── CollectionButton.swift │ │ │ ├── CustomSlider.swift │ │ │ ├── IconButton.swift │ │ │ ├── LUTButton.swift │ │ │ └── RecipeButton.swift │ │ └── Utility │ │ │ └── Utility.swift │ ├── Controller │ │ ├── Action.swift │ │ ├── CropperController.swift │ │ ├── ExportController.swift │ │ ├── FiltersController.swift │ │ ├── LutsController.swift │ │ ├── PhotoEditorController.swift │ │ └── RecipeController.swift │ ├── PhotoEditorView.swift │ ├── image │ │ └── ImagePreviewView.swift │ └── model │ │ └── FilterModel.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── TextAlert │ └── TextAlert.swift ├── UI │ ├── ImageBorder.swift │ ├── ListTitle.swift │ └── RaiseButton.swift ├── Utility │ ├── AppContent.swift │ ├── AppTheme.swift │ ├── Constants.swift │ ├── NestedObservableObject.swift │ ├── RecipeUtils.swift │ ├── StorageUtils.swift │ └── Utils.swift ├── colorful_room.xcdatamodeld │ ├── .xccurrentversion │ └── colorful_room.xcdatamodel │ │ └── contents ├── colorful_roomApp.swift ├── model │ ├── Collection.swift │ ├── Data.swift │ ├── ImageSaver.swift │ └── Recipe.swift └── view │ ├── CustomCropperView.swift │ ├── ExportView.swift │ ├── ImagePicker.swift │ ├── MyWebView.swift │ ├── PhotoEditView.swift │ └── RoadMapView.swift ├── colorful-roomTests └── colorful_roomTests.swift ├── colorful-roomUITests ├── colorful_roomUITests.swift └── colorful_roomUITestsLaunchTests.swift └── fastlane ├── .env.sample ├── Appfile ├── Fastfile └── README.md /.github/workflows/Documentation.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Documentation 3 | 4 | on: 5 | push: 6 | branches: 7 | - main 8 | 9 | workflow_dispatch: 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v1 17 | 18 | - name: Generate Documentation 19 | uses: SwiftDocOrg/swift-doc@master 20 | with: 21 | inputs: "./" 22 | output: "Documentation" 23 | - name: Upload Documentation to Wiki 24 | uses: SwiftDocOrg/github-wiki-publish-action@v1 25 | with: 26 | path: "Documentation" 27 | env: 28 | GH_PERSONAL_ACCESS_TOKEN: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} 29 | -------------------------------------------------------------------------------- /.github/workflows/swift.yml: -------------------------------------------------------------------------------- 1 | name: Swift 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: macos-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Build 17 | run: swift build -v 18 | - name: Run tests 19 | run: swift test -v 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | Pods/ 43 | 44 | # CocoaPods 45 | # 46 | # We recommend against adding the Pods directory to your .gitignore. However 47 | # you should judge for yourself, the pros and cons are mentioned at: 48 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 49 | # 50 | # Pods/ 51 | # 52 | # Add this line if you want to avoid checking in source code from the Xcode workspace 53 | # *.xcworkspace 54 | 55 | # Carthage 56 | # 57 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 58 | # Carthage/Checkouts 59 | 60 | Carthage/Build 61 | 62 | # fastlane 63 | # 64 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 65 | # screenshots whenever they are needed. 66 | # For more information about the recommended setup visit: 67 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 68 | 69 | fastlane/report.xml 70 | fastlane/Preview.html 71 | fastlane/screenshots/**/*.png 72 | fastlane/test_output 73 | 74 | # Code Injection 75 | # 76 | # After new code Injection tools there's a generated folder /iOSInjectionProject 77 | # https://github.com/johnno1962/injectionforxcode 78 | 79 | iOSInjectionProject/ 80 | Resources/MetaData 81 | 82 | fastlane/.env 83 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | 2 | # Changelog 3 | ## 1.0 4 | - Basic editor, include HLS editor, export your picture and LUTs image", date: "August 15, 2020 5 | ## 1.2 6 | - You can crop image, import more LUTs templates 7 | 8 | # Roadmap 9 | ## 2.0 10 | - Add Effect tool & export all effect", content: "You can add effect and export all effects image that you can use for AR filter 11 | 12 | ## 3.0 13 | - Export Spark AR filter", content: "You can export Spark AR project file when done editing! -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | 1, PingAk9 -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane", ">= 2.196.0" -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Jimmy To 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '13.5' 3 | 4 | 5 | target 'colorful-room' do 6 | # Comment the next line if you don't want to use dynamic frameworks 7 | use_frameworks! 8 | # Pods for colorful-room 9 | pod 'QCropper' 10 | 11 | end 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | # Photo editor with SwiftUI and muukii/Pixel 8 | 9 | [](https://apps.apple.com/us/app/id1525852224/) 10 | 11 | - CoreImage 12 | - CoreGraphics 13 | - [Pixel Engine](https://github.com/muukii/Pixel) 14 | - as Muukii's repository. He use the old user interface - Storyboard. So I cloned his "Pixel Engine" and upgrade UI to swiftUI 15 | - User interface: SwiftUI 16 | - [Tutorial HackingWithSwift](https://www.hackingwithswift.com/books/ios-swiftui/integrating-core-image-with-swiftui) 17 | 18 | 19 | ## Features 20 | 21 | ### 🍌 Adjustment 22 | 23 | * [x] Crop 24 | * [x] Straighten 25 | * [x] Perspective 26 | 27 | ### 🍌 Filter 28 | * [x] ColorCube 29 | * [x] Intensity 30 | * [x] Click again on lut to edit Intensity 31 | 32 | 33 | #### 🍌 Edits 34 | 35 | * [x] Brightness 36 | * [x] Contrast 37 | * [x] Saturation 38 | * [x] Highlights 39 | * [x] Shadows 40 | * [x] Temperature 41 | * [x] GaussianBlur 42 | * [x] Vignette 43 | * [x] Fade 44 | * [x] Sharpen 45 | * [x] Clarity 46 | * [x] HLS 47 | - [About HLS](https://dzone.com/articles/creating-a-selective-hsl-adjustment-filter-in-core) 48 | 49 | ### 🍌 Recipe 50 | 51 | * [x] Save Recipe 52 | * [x] Delete Recipe 53 | 54 | ### 🚀 Road map 55 | 56 | - Add Effect tool 57 | - Export Spark AR filter 58 | -------------------------------------------------------------------------------- /Resources/adjust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/Resources/adjust.png -------------------------------------------------------------------------------- /Resources/app-stoer-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/Resources/app-stoer-black.png -------------------------------------------------------------------------------- /Resources/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/Resources/preview.png -------------------------------------------------------------------------------- /colorful-room.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colorful-room.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colorful-room.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /colorful-room.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colorful-room.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colorful-room.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "PixelEnginePackage", 6 | "repositoryURL": "https://github.com/j1mmyto9/PixelEnginePackage", 7 | "state": { 8 | "branch": null, 9 | "revision": "d3eaf69accc4396f807fe8497efe03f4f33c5763", 10 | "version": "1.0.0" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-40.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "Icon-60.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "Icon-58.png", 17 | "idiom" : "iphone", 18 | "scale" : "2x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "Icon-87.png", 23 | "idiom" : "iphone", 24 | "scale" : "3x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "Icon-80.png", 29 | "idiom" : "iphone", 30 | "scale" : "2x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "filename" : "Icon-120.png", 35 | "idiom" : "iphone", 36 | "scale" : "3x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "Icon-120.png", 41 | "idiom" : "iphone", 42 | "scale" : "2x", 43 | "size" : "60x60" 44 | }, 45 | { 46 | "filename" : "Icon-180.png", 47 | "idiom" : "iphone", 48 | "scale" : "3x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "Icon-20.png", 53 | "idiom" : "ipad", 54 | "scale" : "1x", 55 | "size" : "20x20" 56 | }, 57 | { 58 | "filename" : "Icon-40.png", 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "20x20" 62 | }, 63 | { 64 | "filename" : "Icon-29.png", 65 | "idiom" : "ipad", 66 | "scale" : "1x", 67 | "size" : "29x29" 68 | }, 69 | { 70 | "filename" : "Icon-58.png", 71 | "idiom" : "ipad", 72 | "scale" : "2x", 73 | "size" : "29x29" 74 | }, 75 | { 76 | "filename" : "Icon-40.png", 77 | "idiom" : "ipad", 78 | "scale" : "1x", 79 | "size" : "40x40" 80 | }, 81 | { 82 | "filename" : "Icon-80.png", 83 | "idiom" : "ipad", 84 | "scale" : "2x", 85 | "size" : "40x40" 86 | }, 87 | { 88 | "filename" : "Icon-76.png", 89 | "idiom" : "ipad", 90 | "scale" : "1x", 91 | "size" : "76x76" 92 | }, 93 | { 94 | "filename" : "Icon-152.png", 95 | "idiom" : "ipad", 96 | "scale" : "2x", 97 | "size" : "76x76" 98 | }, 99 | { 100 | "filename" : "Icon-167.png", 101 | "idiom" : "ipad", 102 | "scale" : "2x", 103 | "size" : "83.5x83.5" 104 | }, 105 | { 106 | "filename" : "Icon-1024.png", 107 | "idiom" : "ios-marketing", 108 | "scale" : "1x", 109 | "size" : "1024x1024" 110 | } 111 | ], 112 | "info" : { 113 | "author" : "xcode", 114 | "version" : 1 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-1024.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-120.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-152.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-167.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-180.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-20.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-29.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-58.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-60.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-80.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/AppIcon.appiconset/Icon-87.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/ant-rotate-left.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ant-rotate-left.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/ant-rotate-left.imageset/ant-rotate-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/adjustment/ant-rotate-left.imageset/ant-rotate-left.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/crop.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "crop.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/crop.imageset/crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/adjustment/crop.imageset/crop.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/flip.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "flip.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/flip.imageset/flip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/adjustment/flip.imageset/flip.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/perspective.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "perspective.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/perspective.imageset/perspective.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/adjustment/perspective.imageset/perspective.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/rotate-right.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "rotate-right.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/rotate-right.imageset/rotate-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/adjustment/rotate-right.imageset/rotate-right.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/skew-less.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "skew-less.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/adjustment/skew-less.imageset/skew-less.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/adjustment/skew-less.imageset/skew-less.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/adjustment-highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "adjustment-highlight.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/adjustment-highlight.imageset/adjustment-highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/adjustment-highlight.imageset/adjustment-highlight.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/adjustment.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "adjustment.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/adjustment.imageset/adjustment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/adjustment.imageset/adjustment.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-color-highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-color-highlight.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-color-highlight.imageset/edit-color-highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-color-highlight.imageset/edit-color-highlight.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-color.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-color.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-color.imageset/edit-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-color.imageset/edit-color.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-effect.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-effect.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-effect.imageset/edit-effect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-effect.imageset/edit-effect.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-lut-highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-lut-highlight.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-lut-highlight.imageset/edit-lut-highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-lut-highlight.imageset/edit-lut-highlight.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-lut.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-lut.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-lut.imageset/edit-lut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-lut.imageset/edit-lut.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-recipe-highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-recipe-highlight.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-recipe-highlight.imageset/edit-recipe-highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-recipe-highlight.imageset/edit-recipe-highlight.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-recipe.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "edit-recipe.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/edit-recipe.imageset/edit-recipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/edit-recipe.imageset/edit-recipe.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-download.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-download.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-download.imageset/icon-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/icon-download.imageset/icon-download.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-lut.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-lut.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-lut.imageset/icon-lut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/icon-lut.imageset/icon-lut.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-photo-add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-photo-add.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-photo-add.imageset/icon-photo-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/icon-photo-add.imageset/icon-photo-add.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-undo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-undo.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/buttons/icon-undo.imageset/icon-undo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/buttons/icon-undo.imageset/icon-undo.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/accent.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.750", 9 | "green" : "0.831", 10 | "red" : "0.068" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/background.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x20", 9 | "green" : "0x1F", 10 | "red" : "0x1E" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/bronze.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0x56", 10 | "red" : "0xB4" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/button-dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x3D", 9 | "green" : "0x3C", 10 | "red" : "0x3B" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/divider.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x2B", 9 | "green" : "0x29", 10 | "red" : "0x27" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/gold.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0xB8", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/gray-dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.420", 9 | "green" : "0.404", 10 | "red" : "0.384" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/gray-light.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE7", 9 | "green" : "0xE3", 10 | "red" : "0xDE" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/gray.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x9B", 9 | "green" : "0x96", 10 | "red" : "0x90" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/panel.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x26", 9 | "green" : "0x25", 10 | "red" : "0x24" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/primary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "255", 9 | "green" : "84", 10 | "red" : "241" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/colors/sliver.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.906", 9 | "green" : "0.890", 10 | "red" : "0.871" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/brightness.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "brightness.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/brightness.imageset/brightness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/brightness.imageset/brightness.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/contrast.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "contrast.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/contrast.imageset/contrast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/contrast.imageset/contrast.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/fade.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fade.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/fade.imageset/fade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/fade.imageset/fade.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/hls.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hls.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/hls.imageset/hls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/hls.imageset/hls.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/saturation.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "saturation.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/saturation.imageset/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/saturation.imageset/saturation.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/temperature.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "white-balance.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/temperature.imageset/white-balance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/temperature.imageset/white-balance.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/tone.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tone.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/edit-buttons/tone.imageset/tone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/edit-buttons/tone.imageset/tone.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/carem.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "carem.jpg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/carem.imageset/carem.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/images/carem.imageset/carem.jpg -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/intro-image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "intro-image.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/intro-image.imageset/intro-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/images/intro-image.imageset/intro-image.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/sample-image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sample-image.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/images/sample-image.imageset/sample-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/images/sample-image.imageset/sample-image.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-1.imageset/cinematic-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-1.imageset/cinematic-1.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-10.imageset/cinematic-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-10.imageset/cinematic-10.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-2.imageset/cinematic-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-2.imageset/cinematic-2.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-3.imageset/cinematic-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-3.imageset/cinematic-3.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-4.imageset/cinematic-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-4.imageset/cinematic-4.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-5.imageset/cinematic-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-5.imageset/cinematic-5.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-6.imageset/cinematic-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-6.imageset/cinematic-6.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-7.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-7.imageset/cinematic-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-7.imageset/cinematic-7.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-8.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-8.imageset/cinematic-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-8.imageset/cinematic-8.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cinematic-9.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/cinematic/cinematic-9.imageset/cinematic-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/cinematic/cinematic-9.imageset/cinematic-9.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/film-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "film-1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/film-1.imageset/film-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/film/film-1.imageset/film-1.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/film-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "film-2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/film-2.imageset/film-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/film/film-2.imageset/film-2.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/film-3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "film-3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/film/film-3.imageset/film-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/film/film-3.imageset/film-3.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/lut-normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lut.jpg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "original" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/lut-normal.imageset/lut.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/lut-normal.imageset/lut.jpg -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-1.imageset/selfie-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-1.imageset/selfie-1.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-10.imageset/selfie-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-10.imageset/selfie-10.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-11.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-11.imageset/selfie-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-11.imageset/selfie-11.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-12.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-12.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-12.imageset/selfie-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-12.imageset/selfie-12.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-2.imageset/selfie-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-2.imageset/selfie-2.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-3.imageset/selfie-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-3.imageset/selfie-3.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-4.imageset/selfie-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-4.imageset/selfie-4.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-5.imageset/selfie-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-5.imageset/selfie-5.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-6.imageset/selfie-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-6.imageset/selfie-6.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-7.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-7.imageset/selfie-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-7.imageset/selfie-7.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-8.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-8.imageset/selfie-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-8.imageset/selfie-8.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "selfie-9.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/selfie good skin/selfie-9.imageset/selfie-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/selfie good skin/selfie-9.imageset/selfie-9.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-1.imageset/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-1.imageset/01.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "01.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-10.imageset/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-10.imageset/10.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-2.imageset/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-2.imageset/02.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "02.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-3.imageset/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-3.imageset/03.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "03.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-4.imageset/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-4.imageset/04.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "04.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-5.imageset/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-5.imageset/05.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "05.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-6.imageset/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-6.imageset/06.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "06.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-7.imageset/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-7.imageset/07.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "07.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-8.imageset/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-8.imageset/08.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "08.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-9.imageset/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/luts/tan/lut-9.imageset/09.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/luts/tan/lut-9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "09.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/emoji-support.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "emoji-support.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/emoji-support.imageset/emoji-support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/ui/emoji-support.imageset/emoji-support.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-bronze.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-bronze.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-bronze.imageset/icon-bronze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/ui/icon-bronze.imageset/icon-bronze.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-gold.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-gold.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-gold.imageset/icon-gold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/ui/icon-gold.imageset/icon-gold.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-heart.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-heart.imageset/icon-heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/ui/icon-heart.imageset/icon-heart.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-silver.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-silver.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/icon-silver.imageset/icon-silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/ui/icon-silver.imageset/icon-silver.png -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/pattern-top.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pattern-top.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/Assets.xcassets/ui/pattern-top.imageset/pattern-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/khanhuitse05/photo-editor-luts-swiftui/989730049e338cd43cfe9e64a248a849b9e5f54e/colorful-room/Assets.xcassets/ui/pattern-top.imageset/pattern-top.png -------------------------------------------------------------------------------- /colorful-room/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/3/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import UIKit 11 | import PixelEnginePackage 12 | 13 | struct ContentView: View { 14 | 15 | @State private var showSheet = false 16 | 17 | @State private var showImageEdit = false 18 | // for pick view 19 | @State private var pickImage: UIImage? 20 | // for edit view 21 | @State private var inputImage: UIImage? 22 | 23 | 24 | let imageHeight:Double = 355 25 | 26 | var body: some View { 27 | 28 | NavigationView{ 29 | ZStack(alignment: .top){ 30 | Color.myBackground 31 | .edgesIgnoringSafeArea(.all) 32 | Image("intro-image") 33 | .resizable() 34 | .aspectRatio(contentMode: .fill) 35 | .frame(height: CGFloat(imageHeight)) 36 | .edgesIgnoringSafeArea(.top) 37 | 38 | GeometryReader { geo in 39 | VStack(alignment: .center, spacing: 24){ 40 | Spacer() 41 | HStack{ 42 | Text("Create your\ncool filter") 43 | .font(.system(size: 32, weight: .semibold)) 44 | .fontWeight(.semibold) 45 | .padding(.leading, 22) 46 | Spacer() 47 | } 48 | VStack(spacing: 24){ 49 | ForEach(K.introContent, id: \.["title"]){item in 50 | ListTitle( 51 | title: item["title"], 52 | supTitle: item["supTitle"], 53 | leadingImage: item["leadingImage"], 54 | highlight: item["highlight"] 55 | ) 56 | } 57 | } 58 | Spacer().frame(height: 0) 59 | 60 | ZStack{ 61 | Rectangle() 62 | .fill(Color.white) 63 | .frame(width: geo.size.width - 60, height: 52) 64 | HStack(alignment: .center, spacing: 10){ 65 | 66 | Image("icon-photo-add") 67 | .resizable() 68 | .scaledToFit() 69 | .foregroundColor(Color.black) 70 | .frame(width: 18, height: 18) 71 | Text("CHOOSE YOUR PICTURE") 72 | .font(.headline) 73 | .foregroundColor(Color.black) 74 | 75 | } 76 | .onTapGesture { 77 | self.showSheet = true 78 | self.showImageEdit = false 79 | self.inputImage = nil 80 | } 81 | } 82 | 83 | NavigationLink(destination: PhotoEditView(image: self.inputImage) 84 | .navigationBarTitle("") 85 | .navigationBarHidden(true), isActive: self.$showImageEdit) { 86 | EmptyView() 87 | }.hidden() 88 | 89 | } 90 | } 91 | } 92 | .navigationBarTitle("") 93 | .navigationBarHidden(true) 94 | 95 | } 96 | .navigationViewStyle(StackNavigationViewStyle()) 97 | .sheet(isPresented: $showSheet, onDismiss: loadImage){ 98 | ImagePicker(image: self.$pickImage) 99 | }.onAppear(perform: { 100 | // self.pickImage = UIImage(named: "carem") 101 | // self.loadImage() 102 | 103 | }) 104 | 105 | } 106 | 107 | func loadImage(){ 108 | print("loadImage: \(pickImage != nil)") 109 | guard self.pickImage != nil else { 110 | return 111 | } 112 | self.inputImage = self.pickImage 113 | self.showImageEdit = true 114 | } 115 | } 116 | 117 | struct ContentView_Previews: PreviewProvider { 118 | static var previews: some View { 119 | Group { 120 | ContentView() 121 | .background(Color(UIColor.systemBackground)) 122 | .environment(\.colorScheme, .dark) 123 | .environmentObject(PECtl.shared) 124 | .environmentObject(Data.shared) 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /colorful-room/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ITSAppUsesNonExemptEncryption 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colorful-room/Persistence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Persistence.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 10/10/2021. 6 | // 7 | 8 | import CoreData 9 | 10 | struct PersistenceController { 11 | static let shared = PersistenceController() 12 | 13 | static var preview: PersistenceController = { 14 | let result = PersistenceController(inMemory: true) 15 | let viewContext = result.container.viewContext 16 | // for _ in 0..<10 { 17 | // let newItem = Item(context: viewContext) 18 | // newItem.timestamp = Date() 19 | // } 20 | do { 21 | try viewContext.save() 22 | } catch { 23 | // Replace this implementation with code to handle the error appropriately. 24 | // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 25 | let nsError = error as NSError 26 | fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 27 | } 28 | return result 29 | }() 30 | 31 | let container: NSPersistentContainer 32 | 33 | init(inMemory: Bool = false) { 34 | container = NSPersistentContainer(name: "colorful_room") 35 | if inMemory { 36 | container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null") 37 | } 38 | container.loadPersistentStores(completionHandler: { (storeDescription, error) in 39 | if let error = error as NSError? { 40 | // Replace this implementation with code to handle the error appropriately. 41 | // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 42 | 43 | /* 44 | Typical reasons for an error here include: 45 | * The parent directory does not exist, cannot be created, or disallows writing. 46 | * The persistent store is not accessible, due to permissions or data protection when the device is locked. 47 | * The device is out of space. 48 | * The store could not be migrated to the current model version. 49 | Check the error message to determine what the actual problem was. 50 | */ 51 | fatalError("Unresolved error \(error), \(error.userInfo)") 52 | } 53 | }) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ClarityControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TempCode.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ClarityCode: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | 27 | return FilterSlider(value: intensity, range: (0, 1), defaultValue: 0, rangeDisplay: (0, 100)) 28 | .onAppear(perform: didReceiveCurrentEdit) 29 | } 30 | 31 | func didReceiveCurrentEdit() { 32 | 33 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 34 | self.filterIntensity = edit.filters.unsharpMask?.intensity ?? 0 35 | } 36 | 37 | func valueChanged() { 38 | 39 | let value = self.filterIntensity 40 | 41 | guard value != 0 else { 42 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.unsharpMask = nil })) 43 | return 44 | } 45 | 46 | var f = FilterUnsharpMask() 47 | f.intensity = value 48 | f.radius = 0.12 49 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.unsharpMask = f })) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ColorControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BrightnessControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/14/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ColorControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | // Todo: Missing Saturation, Contrast 16 | 17 | var body: some View { 18 | 19 | let intensity = Binding( 20 | get: { 21 | self.filterIntensity 22 | }, 23 | set: { 24 | self.filterIntensity = $0 25 | self.valueChanged() 26 | } 27 | ) 28 | 29 | let min = FilterColor.rangeBrightness.min 30 | let max = FilterColor.rangeBrightness.max 31 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 32 | .onAppear(perform: didReceiveCurrentEdit) 33 | } 34 | 35 | func didReceiveCurrentEdit() { 36 | 37 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 38 | self.filterIntensity = edit.filters.color?.valueBrightness ?? 0 39 | } 40 | 41 | func valueChanged() { 42 | 43 | let value = self.filterIntensity 44 | 45 | guard value != 0 else { 46 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.color = nil })) 47 | return 48 | } 49 | 50 | 51 | var f = FilterColor() 52 | f.valueBrightness = value 53 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.color = f })) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ColorCubeControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorCubeControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/20/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ColorCubeControl: View { 13 | 14 | @State var filterIntensity:Double = 0 15 | 16 | var body: some View { 17 | 18 | let intensity = Binding( 19 | get: { 20 | self.filterIntensity 21 | }, 22 | set: { 23 | self.filterIntensity = $0 24 | self.valueChanged() 25 | } 26 | ) 27 | return FilterSlider(value: intensity, range: (0, 1), defaultValue: 0, rangeDisplay: (0, 100)).onAppear(perform: didReceiveCurrentEdit) 28 | } 29 | 30 | func didReceiveCurrentEdit() { 31 | 32 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 33 | self.filterIntensity = edit.filters.colorCube?.amount ?? 1 34 | } 35 | 36 | func valueChanged() { 37 | 38 | guard let filter: FilterColorCube = PECtl.shared.editState.currentEdit.filters.colorCube else { 39 | return 40 | } 41 | 42 | let value = self.filterIntensity 43 | let clone:FilterColorCube = FilterColorCube(name: filter.name, identifier: filter.identifier, filter: filter.filter, amount: value) 44 | 45 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.colorCube = clone })) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ContrastControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContrastControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ContrastControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterContrast.range.min 27 | let max = FilterContrast.range.max 28 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | 34 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 35 | self.filterIntensity = edit.filters.contrast?.value ?? 0 36 | } 37 | 38 | func valueChanged() { 39 | 40 | let value = self.filterIntensity 41 | 42 | guard value != 0 else { 43 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.contrast = nil })) 44 | return 45 | } 46 | 47 | var f = FilterContrast() 48 | f.value = value 49 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.contrast = f })) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ExposureControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExposureControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ExposureControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterExposure.range.min 27 | let max = FilterExposure.range.max 28 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | 34 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 35 | self.filterIntensity = edit.filters.exposure?.value ?? 0 36 | } 37 | 38 | func valueChanged() { 39 | 40 | let value = self.filterIntensity 41 | 42 | guard value != 0 else { 43 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.exposure = nil })) 44 | return 45 | } 46 | 47 | var f = FilterExposure() 48 | f.value = value 49 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.exposure = f })) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/FadeControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FadeControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct FadeControl: View { 13 | 14 | @State var filterIntensity:Double = 0 15 | 16 | var body: some View { 17 | 18 | let intensity = Binding( 19 | get: { 20 | self.filterIntensity 21 | }, 22 | set: { 23 | self.filterIntensity = $0 24 | self.valueChanged() 25 | } 26 | ) 27 | return FilterSlider(value: intensity, range: (0, 1), defaultValue: 0, rangeDisplay: (0, 100)).onAppear(perform: didReceiveCurrentEdit) 28 | } 29 | 30 | func didReceiveCurrentEdit() { 31 | 32 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 33 | self.filterIntensity = edit.filters.fade?.intensity ?? 0 34 | } 35 | 36 | func valueChanged() { 37 | 38 | let value = self.filterIntensity 39 | 40 | guard value != 0 else { 41 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.fade = nil })) 42 | return 43 | } 44 | 45 | 46 | var f = FilterFade() 47 | f.intensity = value 48 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.fade = f })) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/GaussianBlurControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GaussianBlurControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct GaussianBlurControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterGaussianBlur.range.min 27 | let max = FilterGaussianBlur.range.max 28 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | 34 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 35 | self.filterIntensity = edit.filters.gaussianBlur?.value ?? 0 36 | } 37 | 38 | func valueChanged() { 39 | 40 | let value = self.filterIntensity 41 | 42 | guard value != 0 else { 43 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.gaussianBlur = nil })) 44 | return 45 | } 46 | 47 | var f = FilterGaussianBlur() 48 | f.value = value 49 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.gaussianBlur = f })) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/HLS/ColorSelectButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorSelectButton.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ColorSelectButton: View { 12 | 13 | var index:Int 14 | @Binding var current:Int 15 | 16 | var body: some View { 17 | 18 | let color = HLSControl.colors[index] 19 | return ZStack{ 20 | if(current == index){ 21 | Button(action: action){ 22 | Circle() 23 | .fill(color) 24 | .frame(width: 18, height: 18) 25 | .padding(.all, 4) 26 | .overlay( 27 | Circle() 28 | .stroke(color, lineWidth: 2) 29 | ) 30 | } 31 | }else{ 32 | Button(action: action){ 33 | Circle() 34 | .fill(color) 35 | .frame(width: 24, height: 24) 36 | } 37 | } 38 | } 39 | 40 | } 41 | func action(){ 42 | self.current = self.index 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/HLS/HLSControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HLSControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct HLSControl: View { 13 | 14 | static var colors:[Color] = [ 15 | Color(red: 0.8980392156862745, green: 0, blue: 0), 16 | Color(red: 0.9764705882352941, green: 0.45098039215686275, blue: 0.023529411764705882), 17 | Color(red: 1, green: 1, blue: 0.0784313725490196), 18 | Color(red: 0.08235294117647059, green: 0.6901960784313725, blue: 0.10196078431372549), 19 | Color(red: 0.07450980392156863, green: 0.9176470588235294, blue: 0.788235294117647), 20 | Color(red: 0.011764705882352941, green: 0.2627450980392157, blue: 0.8745098039215686), 21 | Color(red: 0.49411764705882355, green: 0.11764705882352941, blue: 0.611764705882353), 22 | Color(red: 0.7607843137254902, green: 0, blue: 0.47058823529411764), 23 | ] 24 | 25 | @State var current:Int = 0 26 | @State var hue:Double = 0.5 27 | @State var saturation:Double = 0.5 28 | @State var luminance:Double = 0.5 29 | 30 | @State var inputShift:[CIVector]! 31 | 32 | var body: some View { 33 | 34 | let indexCurent = Binding( 35 | get: { 36 | self.current 37 | }, 38 | set: { 39 | self.current = $0 40 | self.colorChange() 41 | } 42 | ) 43 | 44 | let intensityHeu = Binding( 45 | get: { 46 | self.hue 47 | }, 48 | set: { 49 | self.hue = $0 50 | self.valueChanged() 51 | } 52 | ) 53 | let intensitySaturation = Binding( 54 | get: { 55 | self.saturation 56 | }, 57 | set: { 58 | self.saturation = $0 59 | self.valueChanged() 60 | } 61 | ) 62 | let intensityLuminance = Binding( 63 | get: { 64 | self.luminance 65 | }, 66 | set: { 67 | self.luminance = $0 68 | self.valueChanged() 69 | } 70 | ) 71 | 72 | return VStack(alignment: .leading){ 73 | HStack{ 74 | ForEach(0...HLSControl.colors.count - 1, id: \.self){index in 75 | HStack{ 76 | Spacer() 77 | ColorSelectButton(index: index, current: indexCurent) 78 | Spacer() 79 | } 80 | } 81 | } 82 | Spacer() 83 | FilterSlider(value: intensityHeu, range: (-0.2, 0.2), lable: "Hue", defaultValue: 0) 84 | FilterSlider(value: intensitySaturation, range: (0, 2), lable: "Saturation", defaultValue: 1) 85 | FilterSlider(value: intensityLuminance, range: (0.5, 1.5), lable: "Luminance", defaultValue: 1) 86 | Spacer() 87 | } 88 | .onAppear(perform: didReceiveCurrentEdit) 89 | } 90 | 91 | func didReceiveCurrentEdit() { 92 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 93 | guard let hsv:FilterHLS = edit.filters.hls else{ 94 | self.inputShift = FilterHLS.defaultValue 95 | print("hsv NULL") 96 | colorChange() 97 | return 98 | } 99 | self.inputShift = hsv.inputShift 100 | colorChange() 101 | 102 | } 103 | 104 | func colorChange(){ 105 | print("colorChange") 106 | let currentShift:CIVector = self.inputShift[current] 107 | hue = Double(currentShift.x) 108 | saturation = Double(currentShift.y) 109 | luminance = Double(currentShift.z) 110 | } 111 | 112 | func valueChanged() { 113 | self.inputShift[current] = CIVector(x: CGFloat(hue), y: CGFloat(saturation), z: CGFloat(luminance)) 114 | 115 | var hsv = FilterHLS() 116 | hsv.inputShift = self.inputShift 117 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.hls = hsv })) 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/HighlightsControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HighlightsControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct HighlightsControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterHighlights.range.min 27 | let max = FilterHighlights.range.max 28 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0, rangeDisplay: (0, 100)) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | 34 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 35 | self.filterIntensity = edit.filters.highlights?.value ?? 0 36 | } 37 | 38 | func valueChanged() { 39 | 40 | let value = self.filterIntensity 41 | 42 | guard value != 0 else { 43 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.highlights = nil })) 44 | return 45 | } 46 | 47 | var f = FilterHighlights() 48 | f.value = value 49 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.highlights = f })) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/SaturationControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SaturationControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/14/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct SaturationControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterSaturation.range.min 27 | let max = FilterSaturation.range.max 28 | return FilterSlider(value: intensity, range: (min, max), lable: "Saturation", defaultValue: 0) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | 34 | if let edit: EditingStack.Edit = PECtl.shared.editState?.currentEdit{ 35 | self.filterIntensity = edit.filters.saturation?.value ?? 0 36 | } 37 | } 38 | 39 | func valueChanged() { 40 | 41 | let value = self.filterIntensity 42 | 43 | guard value != 0 else { 44 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.saturation = nil })) 45 | return 46 | } 47 | 48 | 49 | var f = FilterSaturation() 50 | f.value = value 51 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.saturation = f })) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ShadowsControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShadowsControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ShadowsControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterShadows.range.min 27 | let max = FilterShadows.range.max 28 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | 34 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 35 | self.filterIntensity = edit.filters.shadows?.value ?? 0 36 | } 37 | 38 | func valueChanged() { 39 | 40 | let value = self.filterIntensity 41 | 42 | guard value != 0 else { 43 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.shadows = nil })) 44 | return 45 | } 46 | 47 | var f = FilterShadows() 48 | f.value = value 49 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.shadows = f })) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/SharpenControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SharpenControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct SharpenControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | return FilterSlider(value: intensity, range: (0, 1), defaultValue: 0, rangeDisplay: (0, 100)) 27 | .onAppear(perform: didReceiveCurrentEdit) 28 | } 29 | 30 | func didReceiveCurrentEdit() { 31 | 32 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 33 | self.filterIntensity = edit.filters.sharpen?.sharpness ?? 0 34 | } 35 | 36 | func valueChanged() { 37 | 38 | let value = self.filterIntensity 39 | 40 | guard value != 0 else { 41 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.sharpen = nil })) 42 | return 43 | } 44 | 45 | var f = FilterSharpen() 46 | f.sharpness = value 47 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.sharpen = f })) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/TemperatureControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TemperatureControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct TemperatureControl: View { 13 | 14 | @State var filterIntensity:Double = 0 15 | 16 | var body: some View { 17 | 18 | let intensity = Binding( 19 | get: { 20 | self.filterIntensity 21 | }, 22 | set: { 23 | self.filterIntensity = $0 24 | self.valueChanged() 25 | } 26 | ) 27 | let min = FilterTemperature.range.min 28 | let max = FilterTemperature.range.max 29 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 30 | .onAppear(perform: didReceiveCurrentEdit) 31 | } 32 | 33 | func didReceiveCurrentEdit() { 34 | 35 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 36 | self.filterIntensity = edit.filters.temperature?.value ?? 0 37 | 38 | } 39 | 40 | func valueChanged() { 41 | 42 | let value = self.filterIntensity 43 | guard value != 0 else { 44 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.temperature = nil })) 45 | return 46 | } 47 | 48 | var f = FilterTemperature() 49 | f.value = value 50 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.temperature = f })) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/ToneControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToneControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/17/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct ToneControl: View { 13 | 14 | @State var highlightIntensity:Double = 0 15 | 16 | @State var shadowIntensity:Double = 0 17 | 18 | var body: some View { 19 | 20 | let highlight = Binding( 21 | get: { 22 | self.highlightIntensity 23 | }, 24 | set: { 25 | self.highlightIntensity = $0 26 | self.valueHighlightChanged() 27 | } 28 | ) 29 | let shadow = Binding( 30 | get: { 31 | self.shadowIntensity 32 | }, 33 | set: { 34 | self.shadowIntensity = $0 35 | self.valueShadowChanged() 36 | } 37 | ) 38 | return VStack(spacing: 24){ 39 | FilterSlider(value: highlight, range: (FilterHighlights.range.min, FilterHighlights.range.max), lable: "Highlights", defaultValue: 0, rangeDisplay: (0, 100), spacing: 8) 40 | 41 | FilterSlider(value: shadow, range: (FilterShadows.range.min, FilterShadows.range.max),lable: "Shadows", defaultValue: 0, spacing: 8) 42 | } 43 | .onAppear(perform: didReceiveCurrentEdit) 44 | } 45 | 46 | func didReceiveCurrentEdit() { 47 | 48 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 49 | self.highlightIntensity = edit.filters.highlights?.value ?? 0 50 | self.shadowIntensity = edit.filters.shadows?.value ?? 0 51 | 52 | } 53 | 54 | func valueHighlightChanged() { 55 | 56 | let value = self.highlightIntensity 57 | guard value != 0 else { 58 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.highlights = nil })) 59 | return 60 | } 61 | 62 | var f = FilterHighlights() 63 | f.value = value 64 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.highlights = f })) 65 | } 66 | func valueShadowChanged() { 67 | 68 | let value = self.shadowIntensity 69 | guard value != 0 else { 70 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.shadows = nil })) 71 | return 72 | } 73 | 74 | var f = FilterShadows() 75 | f.value = value 76 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.shadows = f })) 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/VignetteControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VignetteControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/13/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct VignetteControl: View { 13 | @State var filterIntensity:Double = 0 14 | 15 | var body: some View { 16 | 17 | let intensity = Binding( 18 | get: { 19 | self.filterIntensity 20 | }, 21 | set: { 22 | self.filterIntensity = $0 23 | self.valueChanged() 24 | } 25 | ) 26 | let min = FilterVignette.range.min 27 | let max = FilterVignette.range.max 28 | return FilterSlider(value: intensity, range: (min, max), defaultValue: 0) 29 | .onAppear(perform: didReceiveCurrentEdit) 30 | } 31 | 32 | func didReceiveCurrentEdit() { 33 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 34 | self.filterIntensity = edit.filters.vignette?.value ?? 0 35 | } 36 | 37 | func valueChanged() { 38 | 39 | let value = self.filterIntensity 40 | 41 | guard value != 0 else { 42 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.vignette = nil })) 43 | return 44 | } 45 | 46 | var f = FilterVignette() 47 | f.value = value 48 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.vignette = f })) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Controls/WhiteBalanceControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TemperatureControl.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct WhiteBalanceControl: View { 13 | 14 | @State var temperatureIntensity:Double = 0 15 | 16 | @State var tintIntensity:Double = 0 17 | 18 | var body: some View { 19 | 20 | let temperature = Binding( 21 | get: { 22 | self.temperatureIntensity 23 | }, 24 | set: { 25 | self.temperatureIntensity = $0 26 | self.valueChanged() 27 | } 28 | ) 29 | let tint = Binding( 30 | get: { 31 | self.tintIntensity 32 | }, 33 | set: { 34 | self.tintIntensity = $0 35 | self.valueChanged() 36 | } 37 | ) 38 | return VStack(spacing: 24){ 39 | FilterSlider(value: temperature, range: (FilterWhiteBalance.range.min, FilterWhiteBalance.range.max), lable: "Temperature", defaultValue: 0, spacing: 8) 40 | 41 | FilterSlider(value: tint, range: (FilterWhiteBalance.range.min, FilterWhiteBalance.range.max),lable: "Tint", defaultValue: 0, spacing: 8) 42 | } 43 | .onAppear(perform: didReceiveCurrentEdit) 44 | } 45 | 46 | func didReceiveCurrentEdit() { 47 | 48 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 49 | self.temperatureIntensity = edit.filters.whiteBalance?.valueTemperature ?? 0 50 | self.tintIntensity = edit.filters.whiteBalance?.valueTint ?? 0 51 | 52 | } 53 | 54 | func valueChanged() { 55 | 56 | let valueTemperature = self.temperatureIntensity 57 | 58 | let valueTint = self.tintIntensity 59 | if (valueTemperature == 0 && valueTint == 0) { 60 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.whiteBalance = nil })) 61 | return 62 | } 63 | 64 | var f = FilterWhiteBalance() 65 | f.valueTint = valueTint 66 | f.valueTemperature = valueTemperature 67 | PECtl.shared.didReceive(action: PECtlAction.setFilter({ $0.whiteBalance = f })) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/EditMenuView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditMenuControlView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import QCropper 11 | 12 | struct EditMenuView: View { 13 | 14 | @EnvironmentObject var shared:PECtl 15 | 16 | @State var currentView:EditView = .lut 17 | 18 | var body: some View { 19 | GeometryReader { geometry in 20 | VStack{ 21 | if((self.currentView == .filter && self.shared.currentEditMenu != .none) == false 22 | && self.shared.lutsCtrl.editingLut == false){ 23 | HStack(spacing: 48){ 24 | NavigationLink(destination: 25 | CustomCropperView() 26 | .navigationBarTitle("") 27 | .navigationBarHidden(true) 28 | ){ 29 | IconButton("adjustment") 30 | } 31 | Button(action:{ 32 | self.currentView = .lut 33 | }){ 34 | IconButton(self.currentView == .lut ? "edit-lut-highlight" : "edit-lut") 35 | } 36 | Button(action:{ 37 | if(self.shared.lutsCtrl.loadingLut == false){ 38 | self.currentView = .filter 39 | self.shared.didReceive(action: PECtlAction.commit) 40 | } 41 | }){ 42 | IconButton(self.currentView == .filter ? "edit-color-highlight" : "edit-color") 43 | } 44 | Button(action:{ 45 | self.currentView = .recipe 46 | }){ 47 | IconButton(self.currentView == .recipe ? "edit-recipe-highlight" : "edit-recipe") 48 | } 49 | Button(action:{ 50 | self.shared.didReceive(action: PECtlAction.undo) 51 | }){ 52 | IconButton("icon-undo") 53 | } 54 | } 55 | .frame(width: geometry.size.width, height: 50) 56 | .background(Color.myPanel) 57 | } 58 | Spacer() 59 | ZStack{ 60 | if(self.currentView == .filter){ 61 | FilterMenuUI() 62 | } 63 | if(self.currentView == .lut){ 64 | LutMenuUI() 65 | } 66 | if(self.currentView == .recipe){ 67 | RecipeMenuUI() 68 | } 69 | } 70 | Spacer() 71 | } 72 | 73 | } 74 | } 75 | 76 | 77 | } 78 | 79 | public enum EditView{ 80 | case lut 81 | case filter 82 | case recipe 83 | } 84 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/FilterMenuUI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterMenuView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/14/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct FilterMenuUI: View { 12 | 13 | @EnvironmentObject var shared:PECtl 14 | var index:EditMenu { 15 | get { 16 | return shared.currentEditMenu 17 | } 18 | } 19 | 20 | 21 | var body: some View { 22 | ZStack{ 23 | 24 | VStack{ 25 | Spacer() 26 | ScrollView(.horizontal, showsIndicators: false){ 27 | HStack(spacing: 16){ 28 | Spacer().frame(width: 0) 29 | ForEach(Constants.supportFilters, id: \.name) { filter in 30 | ButtonView(action: filter) 31 | } 32 | Spacer().frame(width: 0) 33 | } 34 | } 35 | Spacer() 36 | Text("Edit Color") 37 | .font(.system(size: 14, weight: .regular)) 38 | .foregroundColor(Color.myGrayLight) 39 | .padding(.bottom, 8) 40 | } 41 | if shared.currentFilter.edit != .none { 42 | VStack{ 43 | Spacer() 44 | if index == .color { 45 | ColorControl() 46 | }else if index == .contrast { 47 | ContrastControl() 48 | }else if index == .vignette { 49 | VignetteControl() 50 | }else if index == .fade { 51 | FadeControl() 52 | }else if index == .highlights { 53 | HighlightsControl() 54 | }else if index == .hls { 55 | HLSControl() 56 | }else if index == .exposure { 57 | ExposureControl() 58 | }else if index == .saturation { 59 | SaturationControl() 60 | }else if index == .shadows { 61 | ShadowsControl() 62 | }else if index == .sharpen { 63 | SharpenControl() 64 | }else if index == .temperature { 65 | TemperatureControl() 66 | }else if index == .vignette { 67 | VignetteControl() 68 | }else if index == .tone { 69 | ToneControl() 70 | }else if index == .white_balance { 71 | WhiteBalanceControl() 72 | }else{ 73 | Text("Todo") 74 | } 75 | 76 | Spacer() 77 | HStack{ 78 | Button(action: { 79 | self.shared.didReceive(action: PECtlAction.revert) 80 | self.shared.currentFilter = FilterModel.noneFilterModel 81 | }){ 82 | Image(systemName: "xmark") 83 | .foregroundColor(.white) 84 | } 85 | Spacer() 86 | Text(shared.currentFilter.name) 87 | .font(.system(size: 14, weight: .regular)) 88 | .foregroundColor(Color.myGrayLight) 89 | Spacer() 90 | Button(action: { 91 | self.shared.didReceive(action: PECtlAction.commit) 92 | self.shared.currentFilter = FilterModel.noneFilterModel 93 | }){ 94 | Image(systemName: "checkmark") 95 | .foregroundColor(.white) 96 | } 97 | }.padding(.bottom, 8) 98 | } 99 | .padding(.horizontal) 100 | .background(Color.myBackground) 101 | } 102 | 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/RecipeMenuUI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeMenuUI.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 09/10/2021. 6 | // Copyright © 2021 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct RecipeMenuUI: View { 13 | 14 | @EnvironmentObject var shared:PECtl 15 | 16 | @State var filterIntensity:Double = 0 17 | 18 | @State var showInputName:Bool = false 19 | 20 | var body: some View { 21 | let hasEdit = PECtl.shared.hasRecipeToSave 22 | return ZStack{ 23 | VStack{ 24 | Spacer() 25 | ScrollView(.horizontal, showsIndicators: false){ 26 | HStack(spacing: 12){ 27 | Spacer().frame(width: 0) 28 | // todo: current recipe 29 | if hasEdit{ 30 | RecipeEmptyButton(name: "New", on: true, action: { 31 | showInputName = true 32 | }) 33 | 34 | // todo: saved recipe 35 | Rectangle() 36 | .fill(Color.myDivider) 37 | .frame(width: 1, height: 92) 38 | } 39 | ForEach(Array(shared.recipesCtrl.recipes.enumerated()), id: \.offset) { index, item in 40 | RecipeButton( 41 | data: item, 42 | on: item.data.objectID == shared.currentRecipe?.objectID, 43 | index: index 44 | ) 45 | } 46 | 47 | Spacer().frame(width: 0) 48 | } 49 | 50 | } 51 | Spacer() 52 | } 53 | 54 | } 55 | .onAppear(perform: didReceiveCurrentEdit) 56 | .alert(isPresented: $showInputName, 57 | TextAlert(title: "Enter your Recipe name", 58 | message: "", 59 | keyboardType: .default) { result in 60 | if let text = result { 61 | // has Text input 62 | shared.recipesCtrl.addRecipe(text) 63 | } 64 | }) 65 | } 66 | 67 | func didReceiveCurrentEdit() { 68 | 69 | let edit: EditingStack.Edit = PECtl.shared.editState.currentEdit 70 | self.filterIntensity = edit.filters.fade?.intensity ?? 0 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/UI/ButtonView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ButtonView: View { 12 | 13 | var action:FilterModel 14 | 15 | @EnvironmentObject var shared:PECtl 16 | 17 | var body: some View { 18 | Button(action: { 19 | self.shared.currentFilter = self.action 20 | }){ 21 | VStack(spacing: 4){ 22 | IconButton(self.action.image, size: 36) 23 | Text(self.action.name) 24 | .font(.system(size: 10, weight: .regular)) 25 | .foregroundColor(Color.myGrayLight) 26 | .padding(.top) 27 | } 28 | .frame(minWidth: 75) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/UI/CollectionButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionButton.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/16/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct CollectionButton: View { 12 | var name:String 13 | 14 | @EnvironmentObject var shared:PECtl 15 | 16 | var body: some View { 17 | Text(name) 18 | .font(.system(size: 14, weight: .regular)) 19 | .foregroundColor(Color.myGrayLight) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/UI/IconButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IconButton.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/15/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct IconButton: View { 12 | var image:String 13 | var size:CGFloat 14 | 15 | init(_ image:String, size:CGFloat = 32) { 16 | self.image = image 17 | self.size = size 18 | } 19 | var body: some View { 20 | Image(self.image) 21 | .renderingMode(.original) 22 | .resizable() 23 | .scaledToFit() 24 | .frame(width: self.size, height: self.size) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/UI/LUTButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LUTButton.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/14/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import PixelEnginePackage 11 | 12 | struct LUTButton: View { 13 | 14 | var cube:PreviewFilterColorCube 15 | 16 | @EnvironmentObject var shared:PECtl 17 | 18 | var body: some View { 19 | let on = shared.lutsCtrl.currentCube == cube.filter.identifier 20 | 21 | return Button(action:{ 22 | if(on){ 23 | self.editAmong() 24 | }else{ 25 | self.valueChanged() 26 | } 27 | }){ 28 | VStack(spacing: 0){ 29 | Image(uiImage: UIImage(cgImage: cube.cgImage)) 30 | .renderingMode(.original) 31 | .resizable() 32 | .aspectRatio(contentMode: .fill) 33 | .frame(width: 68, height: 68) 34 | .clipped() 35 | Text(cube.filter.name) 36 | .font(.system(size: 11, weight: .medium)) 37 | .frame(width: 68, height: 24) 38 | .background(on ? Color.myPrimary : Color.myButtonDark) 39 | .foregroundColor(.white) 40 | 41 | } 42 | .frame(width: 68) 43 | } 44 | } 45 | 46 | func valueChanged() { 47 | shared.lutsCtrl.currentCube = cube.filter.identifier 48 | shared.didReceive(action: PECtlAction.applyFilter({ $0.colorCube = self.cube.filter })) 49 | } 50 | func editAmong(){ 51 | self.shared.lutsCtrl.onSetEditingMode(true) 52 | } 53 | } 54 | 55 | struct NeutralButton: View { 56 | 57 | var image: UIImage 58 | @EnvironmentObject var shared:PECtl 59 | 60 | var body: some View { 61 | let on = shared.lutsCtrl.currentCube.isEmpty 62 | 63 | return Button(action:valueChanged){ 64 | VStack(spacing: 0){ 65 | Image(uiImage: image) 66 | .renderingMode(.original) 67 | .resizable() 68 | .aspectRatio(contentMode: .fill) 69 | .frame(width: 68, height: 68) 70 | .clipped() 71 | 72 | Text("Original") 73 | .font(.system(size: 11, weight: .medium)) 74 | .frame(width: 68, height: 24) 75 | .background(on ? Color.myPrimary : Color.myButtonDark) 76 | .foregroundColor(.white) 77 | } 78 | } 79 | } 80 | 81 | func valueChanged() { 82 | shared.lutsCtrl.selectCube("") 83 | shared.didReceive(action: PECtlAction.applyFilter({ $0.colorCube = nil })) 84 | } 85 | } 86 | 87 | 88 | struct LutLoadingButton: View { 89 | 90 | var name:String 91 | var on:Bool 92 | 93 | var body: some View { 94 | return VStack(spacing: 0){ 95 | Rectangle() 96 | .fill(Color.myGrayDark) 97 | .frame(width: 68, height: 68) 98 | 99 | Text(name) 100 | .font(.system(size: 11, weight: .medium)) 101 | .frame(width: 68, height: 24) 102 | .background(on ? Color.myPrimary : Color.myButtonDark) 103 | .foregroundColor(.white) 104 | } 105 | } 106 | 107 | 108 | } 109 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/UI/RecipeButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeButton.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 09/10/2021. 6 | // Copyright © 2021 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import CoreData 11 | 12 | struct RecipeButton: View { 13 | var data:Recipe 14 | var on:Bool 15 | var index:Int 16 | 17 | 18 | @EnvironmentObject var shared:PECtl 19 | 20 | var body: some View { 21 | return Button(action: valueChanged){ 22 | ZStack{ 23 | VStack(spacing: 0){ 24 | if(data.preview == nil){ 25 | Rectangle() 26 | .fill(Color.myGrayDark) 27 | .frame(width: 68, height: 60) 28 | }else{ 29 | Image(uiImage: data.preview!) 30 | .renderingMode(.original) 31 | .resizable() 32 | .aspectRatio(contentMode: .fill) 33 | .frame(width: 68, height: 68) 34 | .clipped() 35 | } 36 | 37 | Text(data.data.recipeName ?? "Recipe \(index)") 38 | .font(.system(size: 11, weight: .medium)) 39 | .frame(width: 68, height: 24) 40 | .background(on ? Color.myPrimary : Color.myButtonDark) 41 | .foregroundColor(.white) 42 | } 43 | Button(action: deleteItem){ 44 | Image(systemName: "xmark") 45 | .foregroundColor(.white) 46 | }.frame(width: 60, height: 76, alignment: .topTrailing) 47 | } 48 | } 49 | } 50 | func valueChanged() { 51 | shared.didReceive(action: PECtlAction.applyRecipe(shared.recipesCtrl.recipes[index].data)) 52 | } 53 | func deleteItem() { 54 | shared.recipesCtrl.deleteRecipe(index) 55 | } 56 | } 57 | 58 | 59 | struct RecipeEmptyButton: View { 60 | var name:String 61 | var on:Bool 62 | var action: () -> Void 63 | 64 | var body: some View { 65 | return Button(action: action){ 66 | VStack(spacing: 0){ 67 | Rectangle() 68 | .fill(Color.myGrayDark) 69 | .frame(width: 68, height: 60) 70 | 71 | Text(name) 72 | .font(.system(size: 11, weight: .medium)) 73 | .frame(width: 68, height: 24) 74 | .background(on ? Color.myPrimary : Color.myButtonDark) 75 | .foregroundColor(.white) 76 | } 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Components/Utility/Utility.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utility.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/16/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | import UIKit 13 | import CoreImage 14 | 15 | let sharedContext = CIContext(options: [.useSoftwareRenderer : false]) 16 | 17 | 18 | func resizedImage(at image: CIImage, scale: CGFloat, aspectRatio: CGFloat) -> CIImage? { 19 | 20 | let filter = CIFilter(name: "CILanczosScaleTransform") 21 | filter?.setValue(image, forKey: kCIInputImageKey) 22 | filter?.setValue(scale, forKey: kCIInputScaleKey) 23 | filter?.setValue(aspectRatio, forKey: kCIInputAspectRatioKey) 24 | 25 | return filter?.outputImage 26 | } 27 | 28 | 29 | func convertUItoCI(from:UIImage) -> CIImage{ 30 | let image = CIImage(image: from)! 31 | let fixedOriantationImage = image.oriented(forExifOrientation: imageOrientationToTiffOrientation(from.imageOrientation)) 32 | return fixedOriantationImage 33 | } 34 | 35 | func imageOrientationToTiffOrientation(_ value: UIImage.Orientation) -> Int32 { 36 | switch value{ 37 | case .up: 38 | return 1 39 | case .down: 40 | return 3 41 | case .left: 42 | return 8 43 | case .right: 44 | return 6 45 | case .upMirrored: 46 | return 2 47 | case .downMirrored: 48 | return 4 49 | case .leftMirrored: 50 | return 5 51 | case .rightMirrored: 52 | return 7 53 | default: 54 | return 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Controller/Action.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Action.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 16/01/2022. 6 | // 7 | 8 | import Foundation 9 | import PixelEnginePackage 10 | import QCropper 11 | 12 | 13 | public enum PECtlAction { 14 | case setFilter((inout EditingStack.Edit.Filters) -> Void) 15 | case applyFilter((inout EditingStack.Edit.Filters) -> Void) 16 | case commit 17 | case revert 18 | case undo 19 | case applyRecipe(RecipeObject) 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Controller/CropperController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AdjustmentController.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 28/06/2022. 6 | // 7 | import QCropper 8 | 9 | class CropperController{ 10 | 11 | var state:CropperState? 12 | 13 | func setState(_ state:CropperState?){ 14 | self.state = state 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Controller/ExportController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Export.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 16/01/2022. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | import SwiftUI 11 | import PixelEnginePackage 12 | import QCropper 13 | import CoreData 14 | 15 | 16 | class ExportController : ObservableObject{ 17 | 18 | // Export 19 | @Published var originExport:UIImage? 20 | 21 | var originRatio: Double { 22 | get{ 23 | PECtl.shared.originUI.size.width/PECtl.shared.originUI.size.height; 24 | } 25 | } 26 | 27 | var controller: PECtl { 28 | get { 29 | PECtl.shared 30 | } 31 | } 32 | 33 | func prepareExport() { 34 | if(originExport == nil){ 35 | controller.didReceive(action: .commit) 36 | DispatchQueue.main.async { 37 | if let cropperState = self.controller.cropperCtrl.state{ 38 | let originRender = self.controller.originUI.cropped(withCropperState: cropperState) 39 | let source = StaticImageSource(source: convertUItoCI(from: originRender!)) 40 | self.originExport = self.controller.editState.makeCustomRenderer(source: source) 41 | .render(resolution: .full) 42 | }else{ 43 | self.originExport = self.controller.editState.makeRenderer().render(resolution: .full) 44 | } 45 | 46 | 47 | let source = StaticImageSource(source: convertUItoCI(from: Data.shared.neutralLUT)) 48 | } 49 | } 50 | } 51 | 52 | func resetExport() { 53 | originExport = nil 54 | } 55 | 56 | func exportOrigin() { 57 | if let origin = originExport{ 58 | ImageSaver().writeToPhotoAlbum(image: origin) 59 | } 60 | return 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Controller/FiltersController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FiltersController.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 28/06/2022. 6 | // 7 | 8 | import Foundation 9 | class FiltersController{ 10 | 11 | } 12 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Controller/LutsController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LutsController.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 28/06/2022. 6 | // 7 | import Foundation 8 | import Combine 9 | import SwiftUI 10 | import PixelEnginePackage 11 | import CoreData 12 | 13 | class LutsController : ObservableObject{ 14 | 15 | @Published var loadingLut:Bool = false 16 | 17 | // Cube 18 | var collections:[Collection] = [] 19 | var cubeSourceCG:CGImage? 20 | 21 | @Published var currentCube:String = "" 22 | @Published var editingLut:Bool = false 23 | 24 | var showLoading:Bool{ 25 | get{ 26 | return loadingLut || cubeSourceCG == nil 27 | } 28 | } 29 | 30 | func setImage(image:CIImage){ 31 | currentCube = "" 32 | /// setImage 33 | self.cubeSourceCG = nil 34 | loadingLut = true 35 | collections = Data.shared.collections 36 | 37 | DispatchQueue.global(qos: .background).async{ 38 | print("init Cube") 39 | self.cubeSourceCG = sharedContext.createCGImage(image, from: image.extent)! 40 | 41 | for e in self.collections { 42 | e.setImage(image: image) 43 | } 44 | DispatchQueue.main.async { 45 | self.loadingLut = false 46 | } 47 | } 48 | } 49 | 50 | 51 | /// 52 | func selectCube(_ value:String){ 53 | currentCube = value 54 | } 55 | 56 | /// 57 | func onSetEditingMode(_ value:Bool){ 58 | editingLut = value 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/Controller/RecipeController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeController.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 28/06/2022. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | import SwiftUI 11 | import PixelEnginePackage 12 | import CoreData 13 | 14 | class RecipeController : ObservableObject{ 15 | 16 | // Recipe 17 | @Published var recipes: [Recipe] = [] 18 | 19 | var sourceImage:CIImage? 20 | 21 | var controller: PECtl { 22 | get { 23 | PECtl.shared 24 | } 25 | } 26 | 27 | init(){ 28 | let data = RecipeUtils.loadRecipe() 29 | self.recipes = [] 30 | for e in data { 31 | let item = Recipe(data: e) 32 | recipes.append(item) 33 | } 34 | } 35 | 36 | func setImage(image:CIImage){ 37 | self.sourceImage = image 38 | DispatchQueue.global(qos: .background).async{ 39 | print("init Recipe") 40 | 41 | for e in self.recipes { 42 | e.setImage(image: image) 43 | } 44 | } 45 | } 46 | 47 | /// 48 | func addRecipe(_ name: String){ 49 | if let e = RecipeUtils.addRecipe(name, filters: controller.editState.currentEdit.filters){ 50 | let item = Recipe(data: e) 51 | if(sourceImage != nil){ 52 | item.setImage(image: sourceImage!) 53 | } 54 | recipes.append(item) 55 | controller.currentRecipe = item.data 56 | } 57 | } 58 | 59 | /// 60 | func deleteRecipe(_ index:Int){ 61 | let result = RecipeUtils.deleteRecipe(recipes[index].data) 62 | if(result){ 63 | recipes.remove(at: index) 64 | } 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/PhotoEditorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditorView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct PhotoEditorView: View { 12 | 13 | @EnvironmentObject var shared:PECtl 14 | 15 | var body: some View { 16 | ZStack{ 17 | VStack(spacing: 0){ 18 | if let image = shared.previewImage{ 19 | ImagePreviewView(image: image) 20 | .frame(maxWidth: .infinity, maxHeight: .infinity) 21 | .clipped() 22 | }else{ 23 | Rectangle() 24 | .fill(Color.myGrayDark) 25 | } 26 | EditMenuView() 27 | .frame(height: 250) 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/image/ImagePreviewView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImagePreviewView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ImagePreviewView: View { 12 | var image:UIImage 13 | 14 | @State var contentMode:ContentMode = .fit 15 | 16 | var body: some View { 17 | GeometryReader { geo in 18 | Image(uiImage: self.image) 19 | .resizable() 20 | .aspectRatio(contentMode: self.contentMode) 21 | .frame(width: geo.size.width, height: geo.size.height, alignment: .center) 22 | .onTapGesture(count: 2) { 23 | withAnimation{ 24 | self.contentMode = self.contentMode == .fit ? .fill : .fit 25 | } 26 | } 27 | } 28 | } 29 | } 30 | 31 | 32 | struct ImagePreviewView_Previews: PreviewProvider { 33 | static var previews: some View { 34 | ImagePreviewView(image: UIImage(named: "carem")!) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /colorful-room/PhotoEditor/model/FilterModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterModel.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 26/09/2021. 6 | // Copyright © 2021 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | 13 | public enum EditMenu { 14 | case none 15 | case exposure 16 | case contrast 17 | case clarity 18 | case temperature 19 | case saturation 20 | case fade 21 | case highlights 22 | case shadows 23 | case vignette 24 | case sharpen 25 | case gaussianBlur 26 | case color 27 | case hls 28 | case tone 29 | case white_balance 30 | } 31 | 32 | class FilterModel{ 33 | 34 | var name:String 35 | var image:String 36 | var edit:EditMenu 37 | 38 | static var noneFilterModel = FilterModel("", edit: EditMenu.none) 39 | 40 | init(_ name:String, image:String = "", edit:EditMenu) { 41 | self.name = name 42 | if(image.isEmpty){ 43 | self.image = name.lowercased() 44 | }else{ 45 | self.image = image 46 | } 47 | self.edit = edit 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /colorful-room/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /colorful-room/TextAlert/TextAlert.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TextAlert.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 30/11/2021. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | import SwiftUI 11 | 12 | public struct TextAlert { 13 | public var title: String // Title of the dialog 14 | public var message: String // Dialog message 15 | public var placeholder: String = "" // Placeholder text for the TextField 16 | public var accept: String = "OK" // The left-most button label 17 | public var cancel: String? = "Cancel" // The optional cancel (right-most) button label 18 | public var secondaryActionTitle: String? = nil // The optional center button label 19 | public var keyboardType: UIKeyboardType = .default // Keyboard tzpe of the TextField 20 | public var action: (String?) -> Void // Triggers when either of the two buttons closes the dialog 21 | public var secondaryAction: (() -> Void)? = nil // Triggers when the optional center button is tapped 22 | } 23 | 24 | extension UIAlertController { 25 | convenience init(alert: TextAlert) { 26 | self.init(title: alert.title, message: alert.message, preferredStyle: .alert) 27 | addTextField { 28 | $0.placeholder = alert.placeholder 29 | $0.keyboardType = alert.keyboardType 30 | } 31 | if let cancel = alert.cancel { 32 | addAction(UIAlertAction(title: cancel, style: .cancel) { _ in 33 | alert.action(nil) 34 | }) 35 | } 36 | if let secondaryActionTitle = alert.secondaryActionTitle { 37 | addAction(UIAlertAction(title: secondaryActionTitle, style: .default, handler: { _ in 38 | alert.secondaryAction?() 39 | })) 40 | } 41 | let textField = self.textFields?.first 42 | addAction(UIAlertAction(title: alert.accept, style: .default) { _ in 43 | alert.action(textField?.text) 44 | }) 45 | } 46 | } 47 | 48 | /// 49 | struct AlertWrapper: UIViewControllerRepresentable { 50 | @Binding var isPresented: Bool 51 | let alert: TextAlert 52 | let content: Content 53 | 54 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIHostingController { 55 | UIHostingController(rootView: content) 56 | } 57 | 58 | final class Coordinator { 59 | var alertController: UIAlertController? 60 | init(_ controller: UIAlertController? = nil) { 61 | self.alertController = controller 62 | } 63 | } 64 | 65 | func makeCoordinator() -> Coordinator { 66 | return Coordinator() 67 | } 68 | 69 | func updateUIViewController(_ uiViewController: UIHostingController, context: UIViewControllerRepresentableContext) { 70 | uiViewController.rootView = content 71 | if isPresented && uiViewController.presentedViewController == nil { 72 | var alert = self.alert 73 | alert.action = { 74 | self.isPresented = false 75 | self.alert.action($0) 76 | } 77 | context.coordinator.alertController = UIAlertController(alert: alert) 78 | uiViewController.present(context.coordinator.alertController!, animated: true) 79 | } 80 | if !isPresented && uiViewController.presentedViewController == context.coordinator.alertController { 81 | uiViewController.dismiss(animated: true) 82 | } 83 | } 84 | } 85 | 86 | extension View { 87 | public func alert(isPresented: Binding, _ alert: TextAlert) -> some View { 88 | AlertWrapper(isPresented: isPresented, alert: alert, content: self) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /colorful-room/UI/ImageBorder.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageBorder.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/23/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ImageBorder: ViewModifier { 12 | func body(content: Content) -> some View { 13 | content 14 | .scaledToFit() 15 | .border(Color.white, width: 1) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /colorful-room/UI/ListTitle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListTitle.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/16/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ListTitle: View { 12 | 13 | var title:String 14 | var supTitle:String 15 | var leadingImage:String 16 | var highlight:String 17 | 18 | init(title:String?, supTitle:String?, leadingImage:String?, highlight:String? = "") { 19 | self.title = title ?? "" 20 | self.supTitle = supTitle ?? "" 21 | self.leadingImage = leadingImage ?? "" 22 | self.highlight = highlight ?? "" 23 | } 24 | 25 | var body: some View { 26 | HStack(alignment: .top, spacing: 0){ 27 | Image(leadingImage) 28 | .resizable() 29 | .scaledToFit() 30 | .frame(width: 32, height: 32) 31 | .padding(.trailing, 20) 32 | VStack(alignment: .leading, spacing: 4){ 33 | HStack(spacing: 8){ 34 | Text(title) 35 | .font(.system(size: 15, weight: .medium)) 36 | .multilineTextAlignment(.leading) 37 | if(highlight.isEmpty == false){ 38 | Text(highlight) 39 | .font(.system(size: 12, weight: .medium)) 40 | .padding(.horizontal, 8) 41 | .padding(.vertical, 3) 42 | .background(Color.myPrimary) 43 | .cornerRadius(2) 44 | } 45 | Spacer() 46 | } 47 | 48 | Text(supTitle) 49 | .font(.system(size: 13, weight: .regular)) 50 | .foregroundColor(Color.gray) 51 | } 52 | Spacer() 53 | }.padding(.horizontal, 24) 54 | } 55 | } 56 | 57 | struct ListTitle_Previews: PreviewProvider { 58 | static var previews: some View { 59 | Group{ 60 | ListTitle( 61 | title: "Free and Premium Filters", 62 | supTitle: "Export your picture, Lookup image, all effects, and more", 63 | leadingImage: "edit-lut", 64 | highlight: "AR filter" 65 | ) 66 | .background(Color(UIColor.systemBackground)) 67 | .environment(\.colorScheme, .dark) 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /colorful-room/UI/RaiseButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RaiseButton.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/23/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct RaiseButton: View { 12 | 13 | var title:String 14 | var systemName:String 15 | init(_ title:String, systemName:String = "arrow.down.to.line") { 16 | self.title = title 17 | self.systemName = systemName 18 | } 19 | 20 | var body: some View { 21 | HStack{ 22 | Image(systemName: systemName) 23 | Text(title) 24 | 25 | } 26 | .font(.system(size: 14, weight: .medium)) 27 | .foregroundColor(.white) 28 | .padding(.horizontal, 20) 29 | .frame(minWidth: 160, minHeight: 48) 30 | .background(Color.myDivider) 31 | .cornerRadius(40) 32 | } 33 | } 34 | 35 | struct RaiseButton_Previews: PreviewProvider { 36 | static var previews: some View { 37 | RaiseButton("Save LUTs image") 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /colorful-room/Utility/AppContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppContent.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 26/11/2020. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | class K{ 13 | 14 | 15 | static var introContent:[[String: String]] = [ 16 | [ 17 | "title": "Free and Premium Filters", 18 | "supTitle": "A lot of filter you can use for your picture", 19 | "leadingImage": "edit-lut" 20 | ], 21 | [ 22 | "title": "Selective Color", 23 | "supTitle": "Freedom to custom your filter ", 24 | "leadingImage": "hls" 25 | ], 26 | [ 27 | "title": "Many Effects are available", 28 | "supTitle": "Freedom to custom your filter ", 29 | "leadingImage": "edit-effect" 30 | ], 31 | [ 32 | "title": "Get all your resources", 33 | "supTitle": "Export your picture, Lookup image, all effects, and more", 34 | "leadingImage": "icon-lut", 35 | "highlight": "AR filter" 36 | ] 37 | ] 38 | 39 | static var roadMapDescription = "Your great contribution will help our team a lot to continue developing better product." 40 | static var roadMapConttent:[[String: String]] = [ 41 | [ 42 | "title":"Lauching Production v1.0", 43 | "body":"Basic editor, include HLS editor, export your picture and LUTs image", 44 | "date":"August 15, 2020" 45 | ], 46 | [ 47 | "title":"Lauching Production v1.1", 48 | "body":"You can crop image, import more LUTs templates", 49 | "date":"December 1 ,2020", 50 | "highLight": "true" 51 | ], 52 | [ 53 | "title":"Add Effect tool & export all effect", 54 | "body":"You can add effect and export all effects image that you can use for AR filter", 55 | "date":"2021" 56 | ], 57 | [ 58 | "title":"Export Spark AR filter", 59 | "body":"You can export Spark AR project file when done editing!", 60 | "date":"2021" 61 | ] 62 | ] 63 | } 64 | -------------------------------------------------------------------------------- /colorful-room/Utility/AppTheme.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppTheme.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/15/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | 12 | extension Color{ 13 | static var myGray:Color{ 14 | get{ 15 | return Color("gray") 16 | } 17 | } 18 | static var myGrayDark:Color{ 19 | get{ 20 | return Color("gray-dark") 21 | } 22 | } 23 | static var myGrayLight:Color{ 24 | get{ 25 | return Color("gray-light") 26 | } 27 | } 28 | static var myPrimary:Color{ 29 | get{ 30 | return Color("primary") 31 | } 32 | } 33 | static var myBackground:Color{ 34 | get{ 35 | return Color("background") 36 | } 37 | } 38 | static var myAccent:Color{ 39 | get{ 40 | return Color("accent") 41 | } 42 | } 43 | static var myButtonDark:Color{ 44 | get{ 45 | return Color("button-dark") 46 | } 47 | } 48 | static var myPanel:Color{ 49 | get{ 50 | return Color("panel") 51 | } 52 | } 53 | static var myDivider:Color{ 54 | get{ 55 | return Color("divider") 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /colorful-room/Utility/Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 16/01/2022. 6 | // 7 | 8 | import Foundation 9 | 10 | public class Constants{ 11 | static var supportFilters:[FilterModel] = [ 12 | FilterModel("Brightness", edit: EditMenu.exposure), 13 | FilterModel("Contrast", edit: EditMenu.contrast), 14 | FilterModel("Saturation", edit: EditMenu.saturation), 15 | FilterModel("White Blance",image:"temperature", edit: EditMenu.white_balance), 16 | FilterModel("Tone",image: "tone", edit: EditMenu.tone), 17 | FilterModel("HSL",image: "hls", edit: EditMenu.hls), 18 | FilterModel("Fade", edit: EditMenu.fade), 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /colorful-room/Utility/NestedObservableObject.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NestedObservableObject.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 28/06/2022. 6 | // 7 | // @ref https://www.swiftbysundell.com/articles/accessing-a-swift-property-wrappers-enclosing-instance/ 8 | // @Ref https://stackoverflow.com/a/58406402/521197 9 | // 10 | 11 | import Foundation 12 | import Combine 13 | 14 | @propertyWrapper 15 | struct NestedObservableObject { 16 | 17 | static subscript( 18 | _enclosingInstance instance: T, 19 | wrapped wrappedKeyPath: ReferenceWritableKeyPath, 20 | storage storageKeyPath: ReferenceWritableKeyPath 21 | ) -> Value { 22 | 23 | get { 24 | if instance[keyPath: storageKeyPath].cancellable == nil, let publisher = instance.objectWillChange as? ObservableObjectPublisher { 25 | instance[keyPath: storageKeyPath].cancellable = 26 | instance[keyPath: storageKeyPath].storage.objectWillChange.sink { _ in 27 | publisher.send() 28 | } 29 | } 30 | 31 | return instance[keyPath: storageKeyPath].storage 32 | } 33 | set { 34 | 35 | if let cancellable = instance[keyPath: storageKeyPath].cancellable { 36 | cancellable.cancel() 37 | } 38 | if let publisher = instance.objectWillChange as? ObservableObjectPublisher { 39 | instance[keyPath: storageKeyPath].cancellable = 40 | newValue.objectWillChange.sink { _ in 41 | publisher.send() 42 | } 43 | } 44 | instance[keyPath: storageKeyPath].storage = newValue 45 | } 46 | } 47 | 48 | @available(*, unavailable, 49 | message: "This property wrapper can only be applied to classes" 50 | ) 51 | var wrappedValue: Value { 52 | get { fatalError() } 53 | set { fatalError() } 54 | } 55 | 56 | private var cancellable: AnyCancellable? 57 | private var storage: Value 58 | 59 | init(wrappedValue: Value) { 60 | storage = wrappedValue 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /colorful-room/Utility/StorageUtils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StorageUtils.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 16/01/2022. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | import SwiftUI 11 | 12 | class StorageUtils{ 13 | 14 | // save image to gallery 15 | func saveToGallery(image: UIImage?){ 16 | if let value = image{ 17 | ImageSaver().writeToPhotoAlbum(image: value) 18 | } 19 | } 20 | 21 | // save Image to disk 22 | func saveToDisk(fileName:String, image: UIImage){ 23 | guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } 24 | 25 | let fileURL = documentsDirectory.appendingPathComponent(fileName) 26 | guard let data = image.jpegData(compressionQuality: 1) else { return } 27 | 28 | do { 29 | try data.write(to: fileURL) 30 | } catch let error { 31 | print("error saving file with error", error) 32 | } 33 | } 34 | 35 | // load image from disk 36 | func loadFromDisk(fileName: String)-> UIImage? { 37 | 38 | let documentDirectory = FileManager.SearchPathDirectory.documentDirectory 39 | 40 | let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask 41 | let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true) 42 | 43 | if let dirPath = paths.first { 44 | let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName) 45 | let image = UIImage(contentsOfFile: imageUrl.path) 46 | return image 47 | } 48 | return nil 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /colorful-room/Utility/Utils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utility.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 8/3/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class Utils{ 13 | static func loadShopurtUrl(){ 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /colorful-room/colorful_room.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | colorful_room.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /colorful-room/colorful_room.xcdatamodeld/colorful_room.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /colorful-room/colorful_roomApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // colorful_roomApp.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 10/10/2021. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct colorful_roomApp: App { 12 | let persistenceController = PersistenceController.shared 13 | 14 | // register initial UserDefaults values every launch 15 | init() { 16 | } 17 | 18 | var body: some Scene { 19 | WindowGroup { 20 | ContentView() 21 | .environment(\.managedObjectContext, persistenceController.container.viewContext) 22 | .environmentObject(PECtl.shared) 23 | .environmentObject(Data.shared) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /colorful-room/model/Collection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Collection.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/15/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import PixelEnginePackage 11 | import SwiftUI 12 | 13 | public class Collection { 14 | 15 | public let name: String 16 | public let identifier: String 17 | public var cubeInfos:[FilterColorCubeInfo] 18 | public var cubePreviews:[PreviewFilterColorCube] = [] 19 | 20 | /// 21 | public func setImage(image:CIImage?){ 22 | self.cubePreviews = [] 23 | if let cubeSourceCI: CIImage = image 24 | { 25 | for item in cubeInfos { 26 | let cube = FilterColorCube(name: item.name, identifier: item.identifier, lutImage: UIImage(named: item.lutImage)!, dimension: 64); 27 | let preview = PreviewFilterColorCube(sourceImage: cubeSourceCI, filter: cube) 28 | cubePreviews.append(preview) 29 | 30 | } 31 | } 32 | } 33 | 34 | /// 35 | public func reset(){ 36 | cubePreviews = [] 37 | } 38 | 39 | /// 40 | public init( 41 | name: String, 42 | identifier: String, 43 | cubeInfos: [FilterColorCubeInfo] = [] 44 | ) { 45 | self.name = name 46 | self.identifier = identifier 47 | self.cubeInfos = cubeInfos 48 | } 49 | 50 | } 51 | 52 | 53 | public struct FilterColorCubeInfo : Equatable { 54 | public let name: String 55 | public let identifier: String 56 | public let lutImage:String 57 | 58 | public init( 59 | name: String, 60 | identifier: String, 61 | lutImage: String 62 | ) { 63 | self.name = name 64 | self.identifier = identifier 65 | self.lutImage = lutImage 66 | } 67 | 68 | func getFilter()-> FilterColorCube{ 69 | return FilterColorCube(name: name, identifier: identifier, lutImage: UIImage(named: lutImage)!, dimension: 64) 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /colorful-room/model/Data.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditController.swift 3 | // test 4 | // 5 | // Created by macOS on 7/2/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | import PixelEnginePackage 12 | 13 | class Data: ObservableObject { 14 | 15 | static var shared = Data(); 16 | 17 | init(){ 18 | autoreleasepool { 19 | neutralLUT = UIImage(named: "lut-normal")! 20 | neutralCube = FilterColorCube( 21 | name: "Neutral", 22 | identifier: "neutral", 23 | lutImage: neutralLUT, 24 | dimension: 64 25 | ) 26 | 27 | // basic 28 | let basic = Collection(name: "Basic", identifier: "Basic", cubeInfos: []) 29 | for i in 1...10{ 30 | let cube = FilterColorCubeInfo( 31 | name: "A\(i)", 32 | identifier: "basic-\(i)", 33 | lutImage: "lut-\(i)" 34 | ) 35 | basic.cubeInfos.append(cube) 36 | } 37 | // Cinematic 38 | let cinematic = Collection(name: "Cinematic", identifier: "Cinematic", cubeInfos: []) 39 | for i in 1...10{ 40 | let cube = FilterColorCubeInfo( 41 | name: "C\(i)", 42 | identifier: "Cinematic-\(i)", 43 | lutImage: "cinematic-\(i)" 44 | ) 45 | cinematic.cubeInfos.append(cube) 46 | } 47 | // Film 48 | let film = Collection(name: "Film", identifier: "Film", cubeInfos: []) 49 | for i in 1...3{ 50 | let cube = FilterColorCubeInfo( 51 | name: "Film\(i)", 52 | identifier: "Film-\(i)", 53 | lutImage: "film-\(i)" 54 | ) 55 | film.cubeInfos.append(cube) 56 | } 57 | // Selfie Good Skin 58 | let selfie = Collection(name: "Selfie", identifier: "Selfie", cubeInfos: []) 59 | for i in 1...12{ 60 | let cube = FilterColorCubeInfo( 61 | name: "Selfie\(i)", 62 | identifier: "Selfie-\(i)", 63 | lutImage: "selfie-\(i)" 64 | ) 65 | selfie.cubeInfos.append(cube) 66 | } 67 | // init collections 68 | self.collections = [basic, cinematic, film, selfie] 69 | } 70 | } 71 | 72 | 73 | 74 | var neutralLUT: UIImage! 75 | 76 | var neutralCube: FilterColorCube! 77 | var collections:[Collection]! 78 | 79 | 80 | 81 | // Cube by collection 82 | func cubeBy(identifier:String) -> FilterColorCube?{ 83 | for e in self.collections { 84 | for cube in e.cubeInfos{ 85 | if(cube.identifier == identifier){ 86 | return cube.getFilter() 87 | } 88 | } 89 | } 90 | return nil; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /colorful-room/model/ImageSaver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageSaver.swift 3 | // test 4 | // 5 | // Created by macOS on 7/2/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Combine 11 | 12 | class ImageSaver: NSObject { 13 | 14 | var successHandler: (() -> Void)? 15 | var errorHandler: ((Error) -> Void)? 16 | 17 | func writeToPhotoAlbum(image: UIImage) { 18 | UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveError), nil) 19 | } 20 | 21 | @objc func saveError(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { 22 | if let error = error { 23 | errorHandler?(error) 24 | print("Oops: \(error.localizedDescription)") 25 | } else { 26 | successHandler?() 27 | print("Success!") 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /colorful-room/model/Recipe.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Recipe.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 28/06/2022. 6 | // 7 | 8 | import Foundation 9 | import PixelEnginePackage 10 | import SwiftUI 11 | import Foundation 12 | import CoreImage 13 | import SwiftUI 14 | 15 | public class Recipe { 16 | 17 | public let data: RecipeObject 18 | public var preview:UIImage? 19 | 20 | init(data: RecipeObject){ 21 | self.data = data 22 | preview = nil 23 | } 24 | /// 25 | public func setImage(image:CIImage?){ 26 | 27 | if let cubeSourceCI: CIImage = image 28 | { 29 | let draft = EditingStack.init(source: StaticImageSource(source: cubeSourceCI)) 30 | let colorCube:FilterColorCube? = Data.shared.cubeBy(identifier: data.lutIdentifier ?? "") 31 | 32 | draft.set(filters: RecipeUtils.applyRecipe(data, colorCube: colorCube)) 33 | if let ciImage = draft.previewImage{ 34 | if let cgimg = sharedContext.createCGImage(ciImage, from: ciImage.extent) { 35 | self.preview = UIImage(cgImage: cgimg) 36 | } 37 | } 38 | } 39 | } 40 | 41 | } 42 | 43 | -------------------------------------------------------------------------------- /colorful-room/view/CustomCropperView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CropperViewController.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 26/11/2020. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | import QCropper 12 | 13 | 14 | struct CustomCropperView: UIViewControllerRepresentable { 15 | 16 | 17 | @Environment(\.presentationMode) var presentationMode 18 | @EnvironmentObject var shared:PECtl 19 | 20 | 21 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> CropperViewController { 22 | let picker = CropperViewController(originalImage: shared.originUI ?? UIImage(), initialState: shared.cropperCtrl.state) 23 | picker.delegate = context.coordinator 24 | return picker 25 | } 26 | 27 | func updateUIViewController(_ uiViewController: CropperViewController, context: UIViewControllerRepresentableContext) { 28 | 29 | } 30 | 31 | func makeCoordinator() -> CropperViewCoordinator { 32 | CropperViewCoordinator(self) 33 | } 34 | } 35 | 36 | class CropperViewCoordinator: NSObject, UINavigationControllerDelegate, CropperViewControllerDelegate{ 37 | 38 | let parent: CustomCropperView 39 | 40 | init(_ parent:CustomCropperView) { 41 | self.parent = parent 42 | } 43 | 44 | func cropperDidConfirm(_ cropper: CropperViewController, state: CropperState?) { 45 | PECtl.shared.cropperCtrl.setState(state) 46 | parent.presentationMode.wrappedValue.dismiss() 47 | } 48 | 49 | func cropperDidCancel(_ cropper: CropperViewController) { 50 | parent.presentationMode.wrappedValue.dismiss() 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /colorful-room/view/ExportView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExportView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/23/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ExportView: View { 12 | 13 | @State var shared:ExportController = ExportController() 14 | @State private var showSheet:Bool = false 15 | @State private var showSuccessPopup = false 16 | 17 | 18 | @Environment(\.presentationMode) var presentationMode: Binding 19 | 20 | var body: some View { 21 | ZStack{ 22 | Color.myBackground 23 | .edgesIgnoringSafeArea(.all) 24 | VStack{ 25 | HStack{ 26 | Spacer() 27 | Button(action:{ 28 | self.shared.resetExport() 29 | self.presentationMode.wrappedValue.dismiss() 30 | }){ 31 | Image(systemName: "xmark") 32 | .foregroundColor(.white) 33 | } 34 | } 35 | .padding() 36 | .padding(.trailing) 37 | 38 | Text("Export your photo") 39 | .font(.system(size: 26, weight: .semibold)) 40 | .multilineTextAlignment(.center) 41 | Text("You can download all that apply in your filter.\nAlways for FREE") 42 | .font(.system(size: 14)) 43 | .multilineTextAlignment(.center) 44 | .foregroundColor(Color.myGray) 45 | .padding() 46 | 47 | Spacer() 48 | ScrollView(.horizontal, showsIndicators: false){ 49 | HStack(spacing: 24){ 50 | Spacer().frame(width: 8) 51 | VStack{ 52 | if let origin = self.shared.originExport{ 53 | Image(uiImage: origin) 54 | .resizable() 55 | .modifier(ImageBorder()) 56 | }else{ 57 | Rectangle() 58 | .fill(Color.myPanel) 59 | .frame(width: self.shared.originRatio * 320) 60 | } 61 | 62 | Button(action:{ 63 | self.shared.exportOrigin() 64 | self.showSuccessPopup = true 65 | }){ 66 | RaiseButton("Save picture") 67 | } 68 | .padding(.top, 24) 69 | } 70 | 71 | Spacer().frame(width: 8) 72 | } 73 | } 74 | .frame(height: 400) 75 | .clipped() 76 | Spacer() 77 | 78 | Spacer().frame(height: 16) 79 | } 80 | } 81 | .navigationBarTitle("", displayMode: .inline) 82 | .navigationBarHidden(true) 83 | .navigationViewStyle(StackNavigationViewStyle()) 84 | .alert(isPresented: $showSuccessPopup) { 85 | Alert(title: Text("Success"), message: Text("Your export success"), dismissButton: .default(Text("Close"), action: { 86 | 87 | }) 88 | ) 89 | } 90 | .onAppear(perform: { 91 | print("Export view: onAppear") 92 | shared.prepareExport() 93 | }) 94 | } 95 | } 96 | 97 | struct ExportView_Previews: PreviewProvider { 98 | static var previews: some View { 99 | let shared = PECtl.shared 100 | shared.originUI = UIImage(named: "carem") 101 | return ExportView() 102 | .background(Color(UIColor.systemBackground)) 103 | .environment(\.colorScheme, .dark) 104 | .environmentObject(shared) 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /colorful-room/view/ImagePicker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImagePicker.swift 3 | // test 4 | // 5 | // Created by macOS on 7/2/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ImagePicker: UIViewControllerRepresentable { 12 | 13 | @Environment(\.presentationMode) var presentationMode 14 | @Binding var image:UIImage? 15 | 16 | 17 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIImagePickerController { 18 | let picker = UIImagePickerController() 19 | picker.delegate = context.coordinator 20 | return picker 21 | } 22 | 23 | func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext) { 24 | 25 | } 26 | 27 | func makeCoordinator() -> ImagePickerCoordinator { 28 | ImagePickerCoordinator(self) 29 | } 30 | } 31 | 32 | class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate{ 33 | let parent: ImagePicker 34 | 35 | init(_ parent:ImagePicker) { 36 | self.parent = parent 37 | } 38 | 39 | func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 40 | if let uiImage = info[.originalImage] as? UIImage { 41 | parent.image = uiImage 42 | } 43 | print("picker image dismiss") 44 | parent.presentationMode.wrappedValue.dismiss() 45 | } 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /colorful-room/view/MyWebView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MyWebView.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 8/7/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import WebKit 11 | 12 | struct MyWebView: View { 13 | 14 | var request: URLRequest 15 | init(request: URLRequest) { 16 | self.request = request 17 | } 18 | init(url: URL) { 19 | self.init(request: URLRequest(url: url)) 20 | } 21 | 22 | var body: some View { 23 | WebViewWrapper(request: self.request) 24 | } 25 | } 26 | 27 | final class WebViewWrapper : UIViewRepresentable { 28 | 29 | 30 | var request: URLRequest 31 | init(request: URLRequest) { 32 | self.request = request 33 | } 34 | 35 | func makeUIView(context: Context) -> WKWebView { 36 | let view = WKWebView() 37 | view.load(request) 38 | return view 39 | } 40 | 41 | func updateUIView(_ uiView: WKWebView, context: Context) { 42 | 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /colorful-room/view/PhotoEditView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditView.swift 3 | // colorful-room 4 | // 5 | // Created by macOS on 7/8/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | struct PhotoEditView: View { 13 | init(image initImage:UIImage?){ 14 | 15 | print("Photo edit: init") 16 | guard let image = initImage else { 17 | return 18 | } 19 | 20 | DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)){ 21 | PECtl.shared.setImage(image: image) 22 | } 23 | } 24 | 25 | 26 | @State private var showImagePicker = false 27 | @State private var pickImage:UIImage? 28 | @EnvironmentObject var shared:PECtl 29 | @Environment(\.presentationMode) var presentationMode 30 | 31 | 32 | var body: some View { 33 | NavigationView{ 34 | ZStack{ 35 | Color.myBackground 36 | .edgesIgnoringSafeArea(.all) 37 | VStack{ 38 | HStack{ 39 | Button(action:{ 40 | self.showImagePicker = true 41 | }){ 42 | Text("Library") 43 | .foregroundColor(.white) 44 | .padding(.horizontal) 45 | .padding(.top, 8) 46 | } 47 | Spacer() 48 | if(shared.previewImage != nil){ 49 | NavigationLink(destination: ExportView()){ 50 | Text("Export") 51 | .foregroundColor(.white) 52 | .padding(.horizontal) 53 | .padding(.top, 8) 54 | } 55 | } 56 | } 57 | .zIndex(1) 58 | PhotoEditorView().frame(maxWidth: .infinity, maxHeight: .infinity) 59 | .zIndex(0) 60 | } 61 | } 62 | .navigationBarTitle("") 63 | .navigationBarHidden(true) 64 | 65 | } 66 | .navigationViewStyle(StackNavigationViewStyle()) 67 | .sheet(isPresented: $showImagePicker, onDismiss: self.loadImage){ 68 | ZStack{ 69 | ImagePicker(image: self.$pickImage) 70 | } 71 | 72 | } 73 | } 74 | 75 | 76 | func loadImage(){ 77 | print("Photo edit: pick image finish") 78 | guard let image = self.pickImage else { 79 | return 80 | } 81 | self.pickImage = nil 82 | print("Photo edit: pick then setImage") 83 | self.shared.setImage(image: image) 84 | } 85 | } 86 | 87 | 88 | 89 | 90 | struct PhotoEditView_Previews: PreviewProvider { 91 | 92 | static var previews: some View { 93 | Group { 94 | PhotoEditView(image: UIImage(named: "carem")) 95 | .background(Color(UIColor.systemBackground)) 96 | .environment(\.colorScheme, .dark) 97 | .environmentObject(PECtl.shared) 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /colorful-room/view/RoadMapView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoadMapView.swift 3 | // colorful-room 4 | // 5 | // Created by Ping9 on 8/3/20. 6 | // Copyright © 2020 PingAK9. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct RoadMapView: View { 12 | 13 | @Environment(\.presentationMode) var presentationMode: Binding 14 | 15 | var body: some View { 16 | ZStack(alignment: .top){ 17 | Color.myBackground 18 | .edgesIgnoringSafeArea(.all) 19 | ScrollView(showsIndicators: false){ 20 | VStack(alignment: .leading, spacing: 8){ 21 | HStack{ 22 | Spacer() 23 | Button("Close", action: { 24 | self.presentationMode.wrappedValue.dismiss() 25 | }) 26 | .foregroundColor(Color.myGrayLight) 27 | .padding() 28 | } 29 | Text("Product\nRoad map") 30 | .font(.system(size: 36, weight: .semibold )) 31 | .foregroundColor(Color.myGrayLight) 32 | .frame(height: 110) 33 | 34 | Text(K.roadMapDescription) 35 | .font(.system(size: 15)) 36 | .foregroundColor(Color.gray) 37 | .padding(.vertical) 38 | Text("What are we doing?") 39 | .font(.system(size: 15, weight: .semibold )) 40 | .foregroundColor(Color.myGrayLight) 41 | .padding(.vertical) 42 | 43 | Group{ 44 | ForEach(K.roadMapConttent, id: \.["title"]){item in 45 | RoadStepView(title: item["title"] ?? "", 46 | content: item["body"] ?? "", 47 | date: item["date"] ?? "", 48 | highLight: item["highLight"] == "true") 49 | } 50 | } 51 | 52 | }.padding() 53 | } 54 | } 55 | } 56 | } 57 | 58 | struct RoadMapView_Previews: PreviewProvider { 59 | static var previews: some View { 60 | RoadMapView() 61 | } 62 | } 63 | 64 | 65 | struct RoadStepView: View{ 66 | 67 | var title:String 68 | var content:String 69 | var date:String 70 | 71 | var highLight = false 72 | 73 | var body: some View{ 74 | HStack{ 75 | VStack{ 76 | if(highLight){ 77 | Circle() 78 | .fill(Color.purple) 79 | .frame(width: 10, height: 10).overlay( 80 | RoundedRectangle(cornerRadius: 40) 81 | .stroke(Color(red: 1, green: 0.33, blue: 1, opacity: 0.3), lineWidth: 8) 82 | ) 83 | }else{ 84 | Circle() 85 | .fill(Color.myGray) 86 | .frame(width: 10, height: 10) 87 | } 88 | Rectangle() 89 | .fill(Color.myGrayDark) 90 | .frame(width: 1) 91 | } 92 | .padding(.horizontal) 93 | .padding(.vertical, 4) 94 | VStack(alignment: .leading){ 95 | Text(self.title) 96 | .font(.system(size: 15, weight: .semibold)) 97 | .foregroundColor(highLight ? Color.myGrayLight : Color.myGray) 98 | .padding(.bottom, 10) 99 | 100 | Text(self.content) 101 | .font(.system(size: 14, weight: .regular)) 102 | .foregroundColor(Color.myGray) 103 | 104 | Text(self.date.uppercased()) 105 | .font(.system(size: 11, weight: .regular)) 106 | .foregroundColor(Color.myGrayDark) 107 | .padding(.vertical, 8) 108 | } 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /colorful-roomTests/colorful_roomTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // colorful_roomTests.swift 3 | // colorful-roomTests 4 | // 5 | // Created by Ping9 on 10/10/2021. 6 | // 7 | 8 | import XCTest 9 | @testable import colorful_room 10 | 11 | class colorful_roomTests: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | } 16 | 17 | override func tearDownWithError() throws { 18 | // Put teardown code here. This method is called after the invocation of each test method in the class. 19 | } 20 | 21 | func testExample() throws { 22 | // This is an example of a functional test case. 23 | // Use XCTAssert and related functions to verify your tests produce the correct results. 24 | } 25 | 26 | func testPerformanceExample() throws { 27 | // This is an example of a performance test case. 28 | self.measure { 29 | // Put the code you want to measure the time of here. 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /colorful-roomUITests/colorful_roomUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // colorful_roomUITests.swift 3 | // colorful-roomUITests 4 | // 5 | // Created by Ping9 on 10/10/2021. 6 | // 7 | 8 | import XCTest 9 | 10 | class colorful_roomUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use recording to get started writing UI tests. 31 | // Use XCTAssert and related functions to verify your tests produce the correct results. 32 | } 33 | 34 | func testLaunchPerformance() throws { 35 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { 36 | // This measures how long it takes to launch your application. 37 | measure(metrics: [XCTApplicationLaunchMetric()]) { 38 | XCUIApplication().launch() 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /colorful-roomUITests/colorful_roomUITestsLaunchTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // colorful_roomUITestsLaunchTests.swift 3 | // colorful-roomUITests 4 | // 5 | // Created by Ping9 on 10/10/2021. 6 | // 7 | 8 | import XCTest 9 | 10 | class colorful_roomUITestsLaunchTests: XCTestCase { 11 | 12 | override class var runsForEachTargetApplicationUIConfiguration: Bool { 13 | true 14 | } 15 | 16 | override func setUpWithError() throws { 17 | continueAfterFailure = false 18 | } 19 | 20 | func testLaunch() throws { 21 | let app = XCUIApplication() 22 | app.launch() 23 | 24 | // Insert steps here to perform after app launch but before taking a screenshot, 25 | // such as logging into a test account or navigating somewhere in the app 26 | 27 | let attachment = XCTAttachment(screenshot: app.screenshot()) 28 | attachment.name = "Launch Screen" 29 | attachment.lifetime = .keepAlways 30 | add(attachment) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /fastlane/.env.sample: -------------------------------------------------------------------------------- 1 | # Apple Account 2 | FASTLANE_USER=$your-apple-email 3 | FASTLANE_PASSWORD=$your-apple-email-password 4 | FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=$your-apple-email-specific-password -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("com.marustudio.luts") # The bundle identifier of your app 2 | apple_id("khanhuitse05@gmail.com") # Your Apple email address 3 | team_id("") // TODO 4 | itc_team_id("") // TODO 5 | 6 | # For more information about the Appfile, see: 7 | # https://docs.fastlane.tools/advanced/#appfile 8 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | # 2 | # You can find the documentation at https://docs.fastlane.tools 3 | # 4 | 5 | # Uncomment the line if you want fastlane to automatically update itself 6 | # update_fastlane 7 | 8 | xcodeproj = './colorful-room.xcodeproj' 9 | workspace = './colorful-room.xcworkspace' 10 | 11 | default_platform(:ios) 12 | 13 | platform :ios do 14 | 15 | before_all do 16 | ENV['FASTLANE_APP_IDENTIFIER'] = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier) 17 | end 18 | 19 | desc "Setup and Build for Appstore" 20 | private_lane :build do 21 | increment_build_number({ 22 | xcodeproj: xcodeproj, 23 | build_number: latest_testflight_build_number(app_identifier: ENV['FASTLANE_APP_IDENTIFIER']) + 1 24 | }) 25 | 26 | build_app(workspace: workspace) 27 | end 28 | 29 | desc "Push a new beta build to TestFlight" 30 | lane :beta do 31 | build 32 | upload_to_testflight( 33 | skip_waiting_for_build_processing: true 34 | ) 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ================ 3 | # Installation 4 | 5 | Make sure you have the latest version of the Xcode command line tools installed: 6 | 7 | ``` 8 | xcode-select --install 9 | ``` 10 | 11 | Install _fastlane_ using 12 | ``` 13 | [sudo] gem install fastlane -NV 14 | ``` 15 | or alternatively using `brew install fastlane` 16 | 17 | # Available Actions 18 | ### create_app 19 | ``` 20 | fastlane create_app 21 | ``` 22 | Create on Developer Protal and App Store Connect 23 | 24 | ---- 25 | 26 | ## iOS 27 | ### ios signing 28 | ``` 29 | fastlane ios signing 30 | ``` 31 | Sync signing 32 | ### ios build 33 | ``` 34 | fastlane ios build 35 | ``` 36 | Build binary 37 | ### ios release 38 | ``` 39 | fastlane ios release 40 | ``` 41 | Release to App Store 42 | 43 | ---- 44 | 45 | This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. 46 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). 47 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 48 | --------------------------------------------------------------------------------