├── .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 |
--------------------------------------------------------------------------------