├── .github └── CODEOWNERS ├── .gitignore ├── .rspec ├── .rubocop.yml ├── .yardopts ├── Dangerfile ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── README_Images ├── Icons-Example.png ├── Mask-After.png └── Mask-Before.png ├── Rakefile ├── bin ├── icongen └── rspec ├── docs ├── IOSIconGenerator.html ├── IOSIconGenerator │ ├── CLI.html │ ├── CLI │ │ └── Commands.html │ ├── Helpers.html │ └── Library.html ├── _index.html ├── class_list.html ├── css │ ├── common.css │ ├── full_list.css │ └── style.css ├── file.README.html ├── file_list.html ├── frames.html ├── index.html ├── js │ ├── app.js │ ├── full_list.js │ └── jquery.js ├── method_list.html └── top-level-namespace.html ├── ios_icon_generator.gemspec ├── lib ├── .yardoc │ ├── checksums │ ├── complete │ ├── object_types │ ├── objects │ │ └── root.dat │ └── proxy_types ├── ios_icon_generator.rb └── ios_icon_generator │ ├── cli │ ├── commands │ │ ├── generate.rb │ │ ├── mask.rb │ │ ├── stub.rb │ │ └── version.rb │ └── runner.rb │ ├── helpers │ ├── check_dependencies.rb │ ├── generate_icon.rb │ ├── image_sets_definition.rb │ ├── mask_icon.rb │ └── which.rb │ └── version.rb ├── spec ├── icon_generator_spec.rb ├── resources │ ├── expected │ │ ├── generate.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-100x100.png │ │ │ │ ├── Icon-1024x1024.png │ │ │ │ ├── Icon-120x120.png │ │ │ │ ├── Icon-128x128.png │ │ │ │ ├── Icon-152x152.png │ │ │ │ ├── Icon-167x167.png │ │ │ │ ├── Icon-16x16.png │ │ │ │ ├── Icon-172x172.png │ │ │ │ ├── Icon-180x180.png │ │ │ │ ├── Icon-196x196.png │ │ │ │ ├── Icon-20x20.png │ │ │ │ ├── Icon-216x216.png │ │ │ │ ├── Icon-256x256.png │ │ │ │ ├── Icon-29x29.png │ │ │ │ ├── Icon-32x32.png │ │ │ │ ├── Icon-40x40.png │ │ │ │ ├── Icon-48x48.png │ │ │ │ ├── Icon-512x512.png │ │ │ │ ├── Icon-55x55.png │ │ │ │ ├── Icon-58x58.png │ │ │ │ ├── Icon-60x60.png │ │ │ │ ├── Icon-64x64.png │ │ │ │ ├── Icon-76x76.png │ │ │ │ ├── Icon-80x80.png │ │ │ │ ├── Icon-87x87.png │ │ │ │ └── Icon-88x88.png │ │ ├── mask-square-generated.xcassets │ │ │ └── AppIcon-Beta.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-100x100-Beta.png │ │ │ │ ├── Icon-1024x1024-Beta.png │ │ │ │ ├── Icon-120x120-Beta.png │ │ │ │ ├── Icon-128x128-Beta.png │ │ │ │ ├── Icon-152x152-Beta.png │ │ │ │ ├── Icon-167x167-Beta.png │ │ │ │ ├── Icon-16x16-Beta.png │ │ │ │ ├── Icon-172x172-Beta.png │ │ │ │ ├── Icon-180x180-Beta.png │ │ │ │ ├── Icon-196x196-Beta.png │ │ │ │ ├── Icon-20x20-Beta.png │ │ │ │ ├── Icon-216x216-Beta.png │ │ │ │ ├── Icon-256x256-Beta.png │ │ │ │ ├── Icon-29x29-Beta.png │ │ │ │ ├── Icon-32x32-Beta.png │ │ │ │ ├── Icon-40x40-Beta.png │ │ │ │ ├── Icon-48x48-Beta.png │ │ │ │ ├── Icon-512x512-Beta.png │ │ │ │ ├── Icon-55x55-Beta.png │ │ │ │ ├── Icon-58x58-Beta.png │ │ │ │ ├── Icon-60x60-Beta.png │ │ │ │ ├── Icon-64x64-Beta.png │ │ │ │ ├── Icon-76x76-Beta.png │ │ │ │ ├── Icon-80x80-Beta.png │ │ │ │ ├── Icon-87x87-Beta.png │ │ │ │ └── Icon-88x88-Beta.png │ │ ├── mask-square-stub.xcassets │ │ │ └── AppIcon-Beta.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-100x100-Beta.png │ │ │ │ ├── Icon-1024x1024-Beta.png │ │ │ │ ├── Icon-120x120-Beta.png │ │ │ │ ├── Icon-128x128-Beta.png │ │ │ │ ├── Icon-152x152-Beta.png │ │ │ │ ├── Icon-167x167-Beta.png │ │ │ │ ├── Icon-16x16-Beta.png │ │ │ │ ├── Icon-172x172-Beta.png │ │ │ │ ├── Icon-180x180-Beta.png │ │ │ │ ├── Icon-196x196-Beta.png │ │ │ │ ├── Icon-20x20-Beta.png │ │ │ │ ├── Icon-216x216-Beta.png │ │ │ │ ├── Icon-256x256-Beta.png │ │ │ │ ├── Icon-29x29-Beta.png │ │ │ │ ├── Icon-32x32-Beta.png │ │ │ │ ├── Icon-40x40-Beta.png │ │ │ │ ├── Icon-48x48-Beta.png │ │ │ │ ├── Icon-512x512-Beta.png │ │ │ │ ├── Icon-55x55-Beta.png │ │ │ │ ├── Icon-58x58-Beta.png │ │ │ │ ├── Icon-60x60-Beta.png │ │ │ │ ├── Icon-64x64-Beta.png │ │ │ │ ├── Icon-76x76-Beta.png │ │ │ │ ├── Icon-80x80-Beta.png │ │ │ │ ├── Icon-87x87-Beta.png │ │ │ │ └── Icon-88x88-Beta.png │ │ ├── mask-triangle-generated.xcassets │ │ │ └── AppIcon-Beta.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-100x100-Beta.png │ │ │ │ ├── Icon-1024x1024-Beta.png │ │ │ │ ├── Icon-120x120-Beta.png │ │ │ │ ├── Icon-128x128-Beta.png │ │ │ │ ├── Icon-152x152-Beta.png │ │ │ │ ├── Icon-167x167-Beta.png │ │ │ │ ├── Icon-16x16-Beta.png │ │ │ │ ├── Icon-172x172-Beta.png │ │ │ │ ├── Icon-180x180-Beta.png │ │ │ │ ├── Icon-196x196-Beta.png │ │ │ │ ├── Icon-20x20-Beta.png │ │ │ │ ├── Icon-216x216-Beta.png │ │ │ │ ├── Icon-256x256-Beta.png │ │ │ │ ├── Icon-29x29-Beta.png │ │ │ │ ├── Icon-32x32-Beta.png │ │ │ │ ├── Icon-40x40-Beta.png │ │ │ │ ├── Icon-48x48-Beta.png │ │ │ │ ├── Icon-512x512-Beta.png │ │ │ │ ├── Icon-55x55-Beta.png │ │ │ │ ├── Icon-58x58-Beta.png │ │ │ │ ├── Icon-60x60-Beta.png │ │ │ │ ├── Icon-64x64-Beta.png │ │ │ │ ├── Icon-76x76-Beta.png │ │ │ │ ├── Icon-80x80-Beta.png │ │ │ │ ├── Icon-87x87-Beta.png │ │ │ │ └── Icon-88x88-Beta.png │ │ ├── mask-triangle-stub.xcassets │ │ │ └── AppIcon-Beta.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-100x100-Beta.png │ │ │ │ ├── Icon-1024x1024-Beta.png │ │ │ │ ├── Icon-120x120-Beta.png │ │ │ │ ├── Icon-128x128-Beta.png │ │ │ │ ├── Icon-152x152-Beta.png │ │ │ │ ├── Icon-167x167-Beta.png │ │ │ │ ├── Icon-16x16-Beta.png │ │ │ │ ├── Icon-172x172-Beta.png │ │ │ │ ├── Icon-180x180-Beta.png │ │ │ │ ├── Icon-196x196-Beta.png │ │ │ │ ├── Icon-20x20-Beta.png │ │ │ │ ├── Icon-216x216-Beta.png │ │ │ │ ├── Icon-256x256-Beta.png │ │ │ │ ├── Icon-29x29-Beta.png │ │ │ │ ├── Icon-32x32-Beta.png │ │ │ │ ├── Icon-40x40-Beta.png │ │ │ │ ├── Icon-48x48-Beta.png │ │ │ │ ├── Icon-512x512-Beta.png │ │ │ │ ├── Icon-55x55-Beta.png │ │ │ │ ├── Icon-58x58-Beta.png │ │ │ │ ├── Icon-60x60-Beta.png │ │ │ │ ├── Icon-64x64-Beta.png │ │ │ │ ├── Icon-76x76-Beta.png │ │ │ │ ├── Icon-80x80-Beta.png │ │ │ │ ├── Icon-87x87-Beta.png │ │ │ │ └── Icon-88x88-Beta.png │ │ └── stub.xcassets │ │ │ └── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-100x100.png │ │ │ ├── Icon-1024x1024.png │ │ │ ├── Icon-120x120.png │ │ │ ├── Icon-128x128.png │ │ │ ├── Icon-152x152.png │ │ │ ├── Icon-167x167.png │ │ │ ├── Icon-16x16.png │ │ │ ├── Icon-172x172.png │ │ │ ├── Icon-180x180.png │ │ │ ├── Icon-196x196.png │ │ │ ├── Icon-20x20.png │ │ │ ├── Icon-216x216.png │ │ │ ├── Icon-256x256.png │ │ │ ├── Icon-29x29.png │ │ │ ├── Icon-32x32.png │ │ │ ├── Icon-40x40.png │ │ │ ├── Icon-48x48.png │ │ │ ├── Icon-512x512.png │ │ │ ├── Icon-55x55.png │ │ │ ├── Icon-58x58.png │ │ │ ├── Icon-60x60.png │ │ │ ├── Icon-64x64.png │ │ │ ├── Icon-76x76.png │ │ │ ├── Icon-80x80.png │ │ │ ├── Icon-87x87.png │ │ │ └── Icon-88x88.png │ └── generate.pdf ├── spec_helper.rb └── support │ └── aruba.rb └── vendor ├── Contents-carplay.json ├── Contents-imessage.json ├── Contents-ipad.json ├── Contents-iphone.json ├── Contents-mac.json ├── Contents-watch.json └── README.md /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @stephanecopin 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /_yardoc/ 4 | /coverage/ 5 | /doc/ 6 | /pkg/ 7 | /spec/reports/ 8 | /tmp/ 9 | .bitrise-steps 10 | /.vscode 11 | /spec/resources/generated 12 | 13 | # rspec failure tracking 14 | .rspec_status 15 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | --require spec_helper 4 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | AllCops: 2 | TargetRubyVersion: 2.3 3 | 4 | Naming/PredicateName: 5 | # Method define macros for dynamically generated method. 6 | MethodDefinitionMacros: 7 | - define_method 8 | - define_singleton_method 9 | - def_node_matcher 10 | - def_node_search 11 | 12 | Style/FrozenStringLiteralComment: 13 | EnforcedStyle: always 14 | 15 | Style/Documentation: 16 | Enabled: false 17 | 18 | Style/TrailingCommaInHashLiteral: 19 | EnforcedStyleForMultiline: comma 20 | 21 | Style/TrailingCommaInArrayLiteral: 22 | EnforcedStyleForMultiline: comma 23 | 24 | Style/GlobalVars: 25 | AllowedVariables: ['$trace_enabled', '$verbose_enabled'] 26 | 27 | Style/SignalException: 28 | Enabled: false 29 | 30 | Metrics/LineLength: 31 | AllowHeredoc: true 32 | AllowURI: true 33 | Max: 220 34 | 35 | Metrics/ModuleLength: 36 | Enabled: false 37 | 38 | Metrics/ClassLength: 39 | Enabled: false 40 | 41 | Metrics/BlockLength: 42 | Enabled: false 43 | 44 | Metrics/BlockNesting: 45 | Enabled: false 46 | 47 | Metrics/MethodLength: 48 | Enabled: false 49 | 50 | Metrics/ParameterLists: 51 | Enabled: false 52 | 53 | Metrics/AbcSize: 54 | Enabled: false 55 | 56 | Metrics/CyclomaticComplexity: 57 | Enabled: false 58 | 59 | Metrics/PerceivedComplexity: 60 | Enabled: false 61 | 62 | Lint/ShadowingOuterLocalVariable: 63 | Enabled: false 64 | 65 | Layout/ClassStructure: 66 | Enabled: true 67 | Categories: 68 | module_inclusion: 69 | - include 70 | - prepend 71 | - extend 72 | ExpectedOrder: 73 | - module_inclusion 74 | - constants 75 | - public_class_methods 76 | - initializer 77 | - instance_methods 78 | - protected_methods 79 | - private_methods 80 | 81 | Layout/IndentHeredoc: 82 | EnforcedStyle: powerpack 83 | 84 | Layout/Tab: 85 | Enabled: true 86 | 87 | Layout/IndentationWidth: 88 | Enabled: true 89 | Width: 2 90 | 91 | Layout/TrailingBlankLines: 92 | EnforcedStyle: final_newline 93 | 94 | Layout/MultilineMethodCallIndentation: 95 | EnforcedStyle: indented 96 | 97 | Layout/CaseIndentation: 98 | EnforcedStyle: end 99 | 100 | Layout/EndAlignment: 101 | EnforcedStyleAlignWith: start_of_line 102 | AutoCorrect: true 103 | 104 | Lint/BooleanSymbol: 105 | Enabled: false 106 | -------------------------------------------------------------------------------- /.yardopts: -------------------------------------------------------------------------------- 1 | --output-dir docs 2 | --readme README.md 3 | --no-private 4 | lib/ios_icon_generator/version.rb lib/ios_icon_generator.rb lib/ios_icon_generator/helpers/**/*.rb -------------------------------------------------------------------------------- /Dangerfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | fail('Please rebase to get rid of the merge commits in this PR') if git.commits.any? { |c| c.message =~ /^Merge branch/ } 4 | 5 | updated_files = git.modified_files + git.added_files 6 | changed_files = updated_files + git.deleted_files 7 | has_app_changes = !changed_files.grep(/lib/).empty? 8 | has_test_changes = !changed_files.grep(/spec/).empty? 9 | 10 | warn('Tests were not updated', sticky: false) if has_app_changes && !has_test_changes 11 | 12 | rubocop.lint( 13 | files: updated_files, 14 | force_exclusion: true, 15 | inline_comment: true, 16 | report_danger: true 17 | ) 18 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | source 'https://rubygems.org' 18 | 19 | git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } 20 | 21 | gemspec 22 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | ios_icon_generator (0.1.3) 5 | colored2 6 | hanami-cli 7 | parallel 8 | ruby-progressbar 9 | 10 | GEM 11 | remote: https://rubygems.org/ 12 | specs: 13 | addressable (2.6.0) 14 | public_suffix (>= 2.0.2, < 4.0) 15 | ansi (1.5.0) 16 | aruba (0.14.11) 17 | childprocess (>= 0.6.3, < 3.0.0) 18 | contracts (~> 0.9) 19 | cucumber (>= 1.3.19) 20 | ffi (~> 1.9) 21 | rspec-expectations (>= 2.99) 22 | thor (~> 0.19) 23 | ast (2.4.0) 24 | backports (3.15.0) 25 | builder (3.2.3) 26 | childprocess (2.0.0) 27 | rake (< 13.0) 28 | claide (1.0.2) 29 | claide-plugins (0.9.2) 30 | cork 31 | nap 32 | open4 (~> 1.3) 33 | codecov (0.1.14) 34 | json 35 | simplecov 36 | url 37 | coderay (1.1.2) 38 | colored2 (3.1.2) 39 | concurrent-ruby (1.1.5) 40 | contracts (0.16.0) 41 | cork (0.3.0) 42 | colored2 (~> 3.1) 43 | cucumber (3.1.2) 44 | builder (>= 2.1.2) 45 | cucumber-core (~> 3.2.0) 46 | cucumber-expressions (~> 6.0.1) 47 | cucumber-wire (~> 0.0.1) 48 | diff-lcs (~> 1.3) 49 | gherkin (~> 5.1.0) 50 | multi_json (>= 1.7.5, < 2.0) 51 | multi_test (>= 0.1.2) 52 | cucumber-core (3.2.1) 53 | backports (>= 3.8.0) 54 | cucumber-tag_expressions (~> 1.1.0) 55 | gherkin (~> 5.0) 56 | cucumber-expressions (6.0.1) 57 | cucumber-tag_expressions (1.1.1) 58 | cucumber-wire (0.0.1) 59 | danger (6.0.9) 60 | claide (~> 1.0) 61 | claide-plugins (>= 0.9.2) 62 | colored2 (~> 3.1) 63 | cork (~> 0.1) 64 | faraday (~> 0.9) 65 | faraday-http-cache (~> 2.0) 66 | git (~> 1.5) 67 | kramdown (~> 2.0) 68 | kramdown-parser-gfm (~> 1.0) 69 | no_proxy_fix 70 | octokit (~> 4.7) 71 | terminal-table (~> 1) 72 | danger-rubocop (0.6.1) 73 | danger 74 | rubocop 75 | debase (0.2.2) 76 | debase-ruby_core_source (>= 0.10.2) 77 | debase-ruby_core_source (0.10.5) 78 | diff-lcs (1.3) 79 | docile (1.3.2) 80 | faraday (0.15.4) 81 | multipart-post (>= 1.2, < 3) 82 | faraday-http-cache (2.0.0) 83 | faraday (~> 0.8) 84 | ffi (1.11.1) 85 | ffi (1.11.1-x64-mingw32) 86 | gherkin (5.1.0) 87 | git (1.5.0) 88 | hanami-cli (0.3.1) 89 | concurrent-ruby (~> 1.0) 90 | hanami-utils (~> 1.3) 91 | hanami-utils (1.3.2) 92 | concurrent-ruby (~> 1.0) 93 | transproc (~> 1.0) 94 | jaro_winkler (1.5.3) 95 | json (2.2.0) 96 | kramdown (2.1.0) 97 | kramdown-parser-gfm (1.1.0) 98 | kramdown (~> 2.0) 99 | method_source (0.9.2) 100 | multi_json (1.13.1) 101 | multi_test (0.1.2) 102 | multipart-post (2.1.1) 103 | nap (1.1.0) 104 | no_proxy_fix (0.1.2) 105 | octokit (4.14.0) 106 | sawyer (~> 0.8.0, >= 0.5.3) 107 | open4 (1.3.4) 108 | parallel (1.17.0) 109 | parser (2.6.3.0) 110 | ast (~> 2.4.0) 111 | phashion (1.2.0) 112 | powerpack (0.1.2) 113 | pry (0.12.2) 114 | coderay (~> 1.1.0) 115 | method_source (~> 0.9.0) 116 | public_suffix (3.1.1) 117 | rainbow (3.0.0) 118 | rake (10.5.0) 119 | rspec (3.8.0) 120 | rspec-core (~> 3.8.0) 121 | rspec-expectations (~> 3.8.0) 122 | rspec-mocks (~> 3.8.0) 123 | rspec-core (3.8.2) 124 | rspec-support (~> 3.8.0) 125 | rspec-expectations (3.8.4) 126 | diff-lcs (>= 1.2.0, < 2.0) 127 | rspec-support (~> 3.8.0) 128 | rspec-mocks (3.8.1) 129 | diff-lcs (>= 1.2.0, < 2.0) 130 | rspec-support (~> 3.8.0) 131 | rspec-support (3.8.2) 132 | rubocop (0.64.0) 133 | jaro_winkler (~> 1.5.1) 134 | parallel (~> 1.10) 135 | parser (>= 2.5, != 2.5.1.1) 136 | powerpack (~> 0.1) 137 | rainbow (>= 2.2.2, < 4.0) 138 | ruby-progressbar (~> 1.7) 139 | unicode-display_width (~> 1.4.0) 140 | ruby-debug-ide (0.6.1) 141 | rake (>= 0.8.1) 142 | ruby-progressbar (1.10.1) 143 | sawyer (0.8.2) 144 | addressable (>= 2.3.5) 145 | faraday (> 0.8, < 2.0) 146 | simplecov (0.17.0) 147 | docile (~> 1.1) 148 | json (>= 1.8, < 3) 149 | simplecov-html (~> 0.10.0) 150 | simplecov-console (0.5.0) 151 | ansi 152 | simplecov 153 | terminal-table 154 | simplecov-html (0.10.2) 155 | terminal-table (1.8.0) 156 | unicode-display_width (~> 1.1, >= 1.1.1) 157 | thor (0.20.3) 158 | transproc (1.1.0) 159 | unicode-display_width (1.4.1) 160 | url (0.3.2) 161 | 162 | PLATFORMS 163 | ruby 164 | x64-mingw32 165 | 166 | DEPENDENCIES 167 | aruba 168 | bundler (~> 2.0) 169 | codecov 170 | danger 171 | danger-rubocop 172 | debase (= 0.2.2) 173 | ios_icon_generator! 174 | phashion 175 | pry 176 | rake (~> 10.0) 177 | rspec (~> 3.0) 178 | rubocop (~> 0.64.0) 179 | ruby-debug-ide (= 0.6.1) 180 | simplecov 181 | simplecov-console 182 | 183 | BUNDLED WITH 184 | 2.0.2 185 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | iOS Icon Generator 2 | ============ 3 | 4 | [![Build Status](https://app.bitrise.io/app/b23ec2cde834230f/status.svg?token=IBOm9v8claU8aEpmnLMWig)](https://app.bitrise.io/app/b23ec2cde834230f) 5 | [![Documentation](https://img.shields.io/badge/docs-available-success.svg)](https://fueled.github.io/ios-icon-generator/) 6 | [![LICENSE](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) 7 | [![Version](https://img.shields.io/gem/v/ios_icon_generator.svg)](https://rubygems.org/gems/ios_icon_generator) 8 | [![codecov](https://codecov.io/gh/Fueled/ios-icon-generator/branch/master/graph/badge.svg)](https://codecov.io/gh/Fueled/ios-icon-generator) 9 | 10 | ## Usage 11 | 12 | The CLI currently supports 2 commands: 13 | 14 | - `generate`: generates an iOS App Icon Set from a base PDF 15 | - `mask`: generates a new iOS App Icon Sets from a base one, adding a mask at its bottom left which can be customized. 16 | - `stub`: generates a default iOS App Icon Sets, using a background color, a text and its color. 17 | 18 | ### Installation 19 | 20 | iOS Icon Generator is built using Ruby, and can be installed using its default local installation in your terminal via: 21 | 22 | ```bash 23 | sudo gem install ios_icon_generator 24 | ``` 25 | 26 | If you wish not to use `sudo` permissions to RubyGems, you can follow the instructions of the `CocoaPods` guys [here](https://guides.cocoapods.org/using/getting-started.html#getting-started), by replacing all `cocoapods` with `ios_icon_generator` in the shell commands. 27 | 28 | It requires both [`imagemagick`](http://www.imagemagick.org/) and [`ghostscript`](https://www.ghostscript.com/), both can be installed using Homebrew: 29 | 30 | ```bash 31 | brew install imagemagick ghostscript 32 | ``` 33 | 34 | ### Generate App Icon Sets 35 | 36 | For now, the CLI supports generating app icon sets for all supported platforms: 37 | 38 | - iPhone 39 | - iPad 40 | - Apple Watch 41 | - Mac 42 | - Carplay 43 | 44 | > Please note that the Display P3 color space is not supported yet 45 | 46 | And supports generating sticker packs icons for iMessage apps. 47 | 48 | You can specify iPhone and iPad at the same time, however iMessage must be specified on its own. 49 | 50 | The base syntax of the command is: 51 | 52 | ```bash 53 | icongen generate [XCAsset Folder] --type= 54 | ``` 55 | 56 | If the `XCAsset Folder` is not specified, then the current working is assumed to be the output folder. 57 | The type, if not specified, defaults to `iphone`. 58 | 59 | For example, to generate icons for iPhones and iPads, and output the images set in `Images.xcassets`, run (assuming the path Icon PDF file is also in the current directory and is called `Icon.pdf`): 60 | ```bash 61 | icongen generate Icon.pdf Images.xcassets --type=iphone,ipad 62 | ``` 63 | 64 | There are more options to `icongen generate` which you can discover by running `icongen generate --help`. 65 | 66 | ### Masking Existing App Icon Sets 67 | 68 | The application also supports "masking" app icons, adding a small mask at the bottom-left corner of the icons, allowing for example to convert the following icons: 69 | ![Before Example](README_Images/Mask-Before.png) 70 | Into this: 71 | ![Before Example](README_Images/Mask-After.png) 72 | 73 | The command used in the example was (it assumes that `AppIcon.appiconset` is the original App Icon Set and is in the current working directory): 74 | ```bash 75 | icongen mask AppIcon.appiconset \ 76 | --mask-shape=square \ 77 | --x-size-ratio=0.30 \ 78 | --y-size-ratio=0.30 \ 79 | --size-offset=0.11 \ 80 | --x-offset=0.1 \ 81 | --y-offset=0.1 \ 82 | --background-color='#A36AE9' \ 83 | --stroke-width-offset=0 \ 84 | --font=Symbol \ 85 | --symbol-color='#FFFFFF' 86 | ``` 87 | 88 | For now, the command only supports adding a mask into the bottom-left corner, but allowing to add it anywhere is definitely a feature we want. 89 | 90 | The command supports a lot of customization through options, and you can find more information about each option by typing `icongen mask --help` 91 | 92 | ### Creating temporary icons 93 | 94 | The application also supports creating "temporary" icons, that you would use during development if you don't have an icon yet (for example at project creation). For example, here are some icons created using various commands: 95 | 96 | ![Icons Example](README_Images/Icons-Example.png) 97 | 98 | Here's the command that were run to get each icons above: 99 | ```bash 100 | #1 101 | icongen stub \ 102 | WS \ 103 | --background-color='#A36AE9' \ 104 | --stroke-width-offset=0 \ 105 | --y-offset=-0.04 \ 106 | --size-offset=0.5 \ 107 | --symbol-color='#FFFFFF' 108 | ``` 109 | ```bash 110 | #2 111 | icongen stub \ 112 | W \ 113 | --background-color='#3A7D31' \ 114 | --font=Symbol \ 115 | --stroke-width-offset=0.01 \ 116 | --y-offset=-0.07 \ 117 | --size-offset=0.5 \ 118 | --symbol-color='#C9C9C9' 119 | ``` 120 | ```bash 121 | #3 122 | icongen stub \ 123 | A \ 124 | --background-color='#000000' \ 125 | --stroke-width-offset=0.01 \ 126 | --stroke-color='#FFFFFF' \ 127 | --font='Arial' \ 128 | --size-offset=0.5 \ 129 | --symbol-color='#000000' 130 | ``` 131 | 132 | The command supports a lot of customization through options, and you can find more information about each option by typing `icongen stub --help`. 133 | 134 | ## Development 135 | 136 | ### Set Up 137 | 138 | To set you up for developing on driveshaft, first make sure the repository is cloned and you're in its root folder, and then run the following: 139 | 140 | ```bash 141 | echo "BUNDLE_GEMFILE=\"`pwd`/Gemfile\" bundler exec ruby \"`pwd`/bin/icongen\" \"\${@---help}\"" > /usr/local/bin/icongen-dev 142 | chmod +x /usr/local/bin/icongen-dev 143 | ``` 144 | 145 | All you'll be all set! 146 | To run the development version of `icongen` from anywhere, just run `icongen-dev` rather than `icongen`. 147 | You can then proceed on developing locally on the ios-icon-generator repository, and create a PR whenever a new piece of code is ready to be reviewed and integrated! 148 | 149 | To be able to run the test suite, the dependencies `libpng` and `libjpeg` are required (on top of `imagemagick`) to be installed. You can install them via `homebrew`: 150 | ```bash 151 | brew install libpng libjpeg 152 | ``` 153 | 154 | You may then execute the following command to run the test suite: 155 | ```bash 156 | bundler exec rake 157 | ``` 158 | -------------------------------------------------------------------------------- /README_Images/Icons-Example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/README_Images/Icons-Example.png -------------------------------------------------------------------------------- /README_Images/Mask-After.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/README_Images/Mask-After.png -------------------------------------------------------------------------------- /README_Images/Mask-Before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/README_Images/Mask-Before.png -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'bundler/gem_tasks' 4 | require 'rspec/core/rake_task' 5 | 6 | RSpec::Core::RakeTask.new(:spec) 7 | 8 | task default: :spec 9 | -------------------------------------------------------------------------------- /bin/icongen: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require 'ios_icon_generator/cli/runner' 5 | 6 | IOSIconGenerator::CLI::Runner.new(ARGV.dup).execute! 7 | -------------------------------------------------------------------------------- /bin/rspec: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby2.5 2 | # frozen_string_literal: true 3 | 4 | # 5 | # This file was generated by Bundler. 6 | # 7 | # The application 'rspec' is installed as part of a gem, and 8 | # this file is here to facilitate running it. 9 | # 10 | 11 | require 'pathname' 12 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', 13 | Pathname.new(__FILE__).realpath) 14 | 15 | bundle_binstub = File.expand_path('bundle', __dir__) 16 | 17 | if File.file?(bundle_binstub) 18 | if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ 19 | load(bundle_binstub) 20 | else 21 | abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. 22 | Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") 23 | end 24 | end 25 | 26 | require 'rubygems' 27 | require 'bundler/setup' 28 | 29 | load Gem.bin_path('rspec-core', 'rspec') 30 | -------------------------------------------------------------------------------- /docs/IOSIconGenerator.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Module: IOSIconGenerator 8 | 9 | — Documentation by YARD 0.9.18 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 34 | 35 |
36 | 61 | 62 |

Module: IOSIconGenerator 63 | 64 | 65 | 66 |

67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
80 |
Defined in:
81 |
lib/ios_icon_generator/version.rb,
82 | lib/ios_icon_generator.rb,
lib/ios_icon_generator/helpers/which.rb,
lib/ios_icon_generator/helpers/mask_icon.rb,
lib/ios_icon_generator/helpers/generate_icon.rb,
lib/ios_icon_generator/helpers/image_sets_definition.rb
83 |
84 |
85 | 86 |
87 | 88 |

Overview

89 |
90 | 91 |

Copyright © 2019 Fueled Digital Media, LLC

92 | 93 |

Licensed under the Apache License, Version 2.0 (the “License”); you may not 94 | use this file except in compliance with the License. You may obtain a copy 95 | of the License at

96 | 97 |

www.apache.org/licenses/LICENSE-2.0

99 | 100 |

Unless required by applicable law or agreed to in writing, software 101 | distributed under the License is distributed on an “AS IS” BASIS, WITHOUT 102 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 103 | License for the specific language governing permissions and limitations 104 | under the License.

105 | 106 | 107 |
108 |
109 |
110 | 111 | 112 |

Defined Under Namespace

113 |

114 | 115 | 116 | Modules: Helpers 117 | 118 | 119 | 120 | 121 |

122 | 123 | 124 |

125 | Constant Summary 126 | collapse 127 |

128 | 129 |
130 | 131 |
VERSION = 132 |
133 |
134 | 135 |

The current version of the gem.

136 | 137 | 138 |
139 |
140 |
141 | 142 | 143 |
144 |
145 |
'0.1'
146 | 147 |
148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 |
159 | 160 | 165 | 166 |
167 | 168 | -------------------------------------------------------------------------------- /docs/IOSIconGenerator/CLI.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Module: IOSIconGenerator::CLI 8 | 9 | — Documentation by YARD 0.9.18 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 34 | 35 |
36 | 61 | 62 |

Module: IOSIconGenerator::CLI 63 | 64 | 65 | 66 |

67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
80 |
Defined in:
81 |
lib/ios_icon_generator.rb
82 |
83 | 84 |
85 | 86 |

Overview

87 |
88 | 89 |

:nodoc:

90 | 91 | 92 |
93 |
94 |
95 | 96 | 97 |

Defined Under Namespace

98 |

99 | 100 | 101 | Modules: Commands 102 | 103 | 104 | 105 | 106 |

107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 |
117 | 118 | 123 | 124 |
125 | 126 | -------------------------------------------------------------------------------- /docs/IOSIconGenerator/CLI/Commands.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Module: IOSIconGenerator::CLI::Commands 8 | 9 | — Documentation by YARD 0.9.18 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 34 | 35 |
36 | 61 | 62 |

Module: IOSIconGenerator::CLI::Commands 63 | 64 | 65 | 66 |

67 |
68 | 69 | 70 | 71 | 72 |
73 |
Extended by:
74 |
Hanami::CLI::Registry
75 |
76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 |
85 |
Defined in:
86 |
lib/ios_icon_generator.rb
87 |
88 | 89 |
90 | 91 |

Overview

92 |
93 | 94 |

:nodoc:

95 | 96 | 97 |
98 |
99 |
100 | 101 | 102 |
103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 |
113 | 114 | 119 | 120 |
121 | 122 | -------------------------------------------------------------------------------- /docs/_index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Documentation by YARD 0.9.18 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 32 | 33 |
34 | 54 | 55 |

Documentation by YARD 0.9.18

56 |
57 |

Alphabetic Index

58 | 59 |

File Listing

60 |
    61 | 62 | 63 |
  • README
  • 64 | 65 | 66 |
67 | 68 |
69 |

Namespace Listing A-Z

70 | 71 | 72 | 73 | 74 | 75 | 76 | 107 | 108 |
77 | 78 | 79 |
    80 |
  • H
  • 81 |
      82 | 83 |
    • 84 | Helpers 85 | 86 | (IOSIconGenerator) 87 | 88 |
    • 89 | 90 |
    91 |
92 | 93 | 94 | 105 | 106 |
109 | 110 |
111 | 112 |
113 | 114 | 119 | 120 |
121 | 122 | -------------------------------------------------------------------------------- /docs/class_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Class List 19 | 20 | 21 | 22 |
23 |
24 |

Class List

25 |
26 | 27 | 28 | Classes 29 | 30 | 31 | 32 | Methods 33 | 34 | 35 | 36 | Files 37 | 38 | 39 |
40 | 41 | 42 |
43 | 44 | 49 |
50 | 51 | 52 | -------------------------------------------------------------------------------- /docs/css/common.css: -------------------------------------------------------------------------------- 1 | /* Override this file with custom rules */ -------------------------------------------------------------------------------- /docs/css/full_list.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; 4 | font-size: 13px; 5 | height: 101%; 6 | overflow-x: hidden; 7 | background: #fafafa; 8 | } 9 | 10 | h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; } 11 | .clear { clear: both; } 12 | .fixed_header { position: fixed; background: #fff; width: 100%; padding-bottom: 10px; margin-top: 0; top: 0; z-index: 9999; height: 70px; } 13 | #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; } 14 | #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; } 15 | #full_list { padding: 0; list-style: none; margin-left: 0; margin-top: 80px; font-size: 1.1em; } 16 | #full_list ul { padding: 0; } 17 | #full_list li { padding: 0; margin: 0; list-style: none; } 18 | #full_list li .item { padding: 5px 5px 5px 12px; } 19 | #noresults { padding: 7px 12px; background: #fff; } 20 | #content.insearch #noresults { margin-left: 7px; } 21 | li.collapsed ul { display: none; } 22 | li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; } 23 | li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; } 24 | li { color: #888; cursor: pointer; } 25 | li.deprecated { text-decoration: line-through; font-style: italic; } 26 | li.odd { background: #f0f0f0; } 27 | li.even { background: #fafafa; } 28 | .item:hover { background: #ddd; } 29 | li small:before { content: "("; } 30 | li small:after { content: ")"; } 31 | li small.search_info { display: none; } 32 | a, a:visited { text-decoration: none; color: #05a; } 33 | li.clicked > .item { background: #05a; color: #ccc; } 34 | li.clicked > .item a, li.clicked > .item a:visited { color: #eee; } 35 | li.clicked > .item a.toggle { opacity: 0.5; background-position: bottom right; } 36 | li.collapsed.clicked a.toggle { background-position: top right; } 37 | #search input { border: 1px solid #bbb; border-radius: 3px; } 38 | #full_list_nav { margin-left: 10px; font-size: 0.9em; display: block; color: #aaa; } 39 | #full_list_nav a, #nav a:visited { color: #358; } 40 | #full_list_nav a:hover { background: transparent; color: #5af; } 41 | #full_list_nav span:after { content: ' | '; } 42 | #full_list_nav span:last-child:after { content: ''; } 43 | 44 | #content h1 { margin-top: 0; } 45 | li { white-space: nowrap; cursor: normal; } 46 | li small { display: block; font-size: 0.8em; } 47 | li small:before { content: ""; } 48 | li small:after { content: ""; } 49 | li small.search_info { display: none; } 50 | #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; } 51 | #content.insearch #search { background-position: center right; } 52 | #search input { width: 110px; } 53 | 54 | #full_list.insearch ul { display: block; } 55 | #full_list.insearch .item { display: none; } 56 | #full_list.insearch .found { display: block; padding-left: 11px !important; } 57 | #full_list.insearch li a.toggle { display: none; } 58 | #full_list.insearch li small.search_info { display: block; } 59 | -------------------------------------------------------------------------------- /docs/file_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | File List 19 | 20 | 21 | 22 |
23 |
24 |

File List

25 |
26 | 27 | 28 | Classes 29 | 30 | 31 | 32 | Methods 33 | 34 | 35 | 36 | Files 37 | 38 | 39 |
40 | 41 | 42 |
43 | 44 |
    45 | 46 | 47 |
  • 48 | 49 |
  • 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | -------------------------------------------------------------------------------- /docs/frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Documentation by YARD 0.9.18 6 | 7 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /docs/js/full_list.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | var $clicked = $(null); 4 | var searchTimeout = null; 5 | var searchCache = []; 6 | var caseSensitiveMatch = false; 7 | var ignoreKeyCodeMin = 8; 8 | var ignoreKeyCodeMax = 46; 9 | var commandKey = 91; 10 | 11 | RegExp.escape = function(text) { 12 | return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 13 | } 14 | 15 | function escapeShortcut() { 16 | $(document).keydown(function(evt) { 17 | if (evt.which == 27) { 18 | window.parent.postMessage('navEscape', '*'); 19 | } 20 | }); 21 | } 22 | 23 | function navResizer() { 24 | $(window).mousemove(function(e) { 25 | window.parent.postMessage({ 26 | action: 'mousemove', event: {pageX: e.pageX, which: e.which} 27 | }, '*'); 28 | }).mouseup(function(e) { 29 | window.parent.postMessage({action: 'mouseup'}, '*'); 30 | }); 31 | window.parent.postMessage("navReady", "*"); 32 | } 33 | 34 | function clearSearchTimeout() { 35 | clearTimeout(searchTimeout); 36 | searchTimeout = null; 37 | } 38 | 39 | function enableLinks() { 40 | // load the target page in the parent window 41 | $('#full_list li').on('click', function(evt) { 42 | $('#full_list li').removeClass('clicked'); 43 | $clicked = $(this); 44 | $clicked.addClass('clicked'); 45 | evt.stopPropagation(); 46 | 47 | if (evt.target.tagName === 'A') return true; 48 | 49 | var elem = $clicked.find('> .item .object_link a')[0]; 50 | var e = evt.originalEvent; 51 | var newEvent = new MouseEvent(evt.originalEvent.type); 52 | newEvent.initMouseEvent(e.type, e.canBubble, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget); 53 | elem.dispatchEvent(newEvent); 54 | evt.preventDefault(); 55 | return false; 56 | }); 57 | } 58 | 59 | function enableToggles() { 60 | // show/hide nested classes on toggle click 61 | $('#full_list a.toggle').on('click', function(evt) { 62 | evt.stopPropagation(); 63 | evt.preventDefault(); 64 | $(this).parent().parent().toggleClass('collapsed'); 65 | highlight(); 66 | }); 67 | } 68 | 69 | function populateSearchCache() { 70 | $('#full_list li .item').each(function() { 71 | var $node = $(this); 72 | var $link = $node.find('.object_link a'); 73 | if ($link.length > 0) { 74 | searchCache.push({ 75 | node: $node, 76 | link: $link, 77 | name: $link.text(), 78 | fullName: $link.attr('title').split(' ')[0] 79 | }); 80 | } 81 | }); 82 | } 83 | 84 | function enableSearch() { 85 | $('#search input').keyup(function(event) { 86 | if (ignoredKeyPress(event)) return; 87 | if (this.value === "") { 88 | clearSearch(); 89 | } else { 90 | performSearch(this.value); 91 | } 92 | }); 93 | 94 | $('#full_list').after(""); 95 | } 96 | 97 | function ignoredKeyPress(event) { 98 | if ( 99 | (event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax) || 100 | (event.keyCode == commandKey) 101 | ) { 102 | return true; 103 | } else { 104 | return false; 105 | } 106 | } 107 | 108 | function clearSearch() { 109 | clearSearchTimeout(); 110 | $('#full_list .found').removeClass('found').each(function() { 111 | var $link = $(this).find('.object_link a'); 112 | $link.text($link.text()); 113 | }); 114 | $('#full_list, #content').removeClass('insearch'); 115 | $clicked.parents().removeClass('collapsed'); 116 | highlight(); 117 | } 118 | 119 | function performSearch(searchString) { 120 | clearSearchTimeout(); 121 | $('#full_list, #content').addClass('insearch'); 122 | $('#noresults').text('').hide(); 123 | partialSearch(searchString, 0); 124 | } 125 | 126 | function partialSearch(searchString, offset) { 127 | var lastRowClass = ''; 128 | var i = null; 129 | for (i = offset; i < Math.min(offset + 50, searchCache.length); i++) { 130 | var item = searchCache[i]; 131 | var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name); 132 | var matchString = buildMatchString(searchString); 133 | var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i"); 134 | if (searchName.match(matchRegexp) == null) { 135 | item.node.removeClass('found'); 136 | item.link.text(item.link.text()); 137 | } 138 | else { 139 | item.node.addClass('found'); 140 | item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1'); 141 | lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2'; 142 | item.link.html(item.name.replace(matchRegexp, "$&")); 143 | } 144 | } 145 | if(i == searchCache.length) { 146 | searchDone(); 147 | } else { 148 | searchTimeout = setTimeout(function() { 149 | partialSearch(searchString, i); 150 | }, 0); 151 | } 152 | } 153 | 154 | function searchDone() { 155 | searchTimeout = null; 156 | highlight(); 157 | if ($('#full_list li:visible').size() === 0) { 158 | $('#noresults').text('No results were found.').hide().fadeIn(); 159 | } else { 160 | $('#noresults').text('').hide(); 161 | } 162 | $('#content').removeClass('insearch'); 163 | } 164 | 165 | function buildMatchString(searchString, event) { 166 | caseSensitiveMatch = searchString.match(/[A-Z]/) != null; 167 | var regexSearchString = RegExp.escape(searchString); 168 | if (caseSensitiveMatch) { 169 | regexSearchString += "|" + 170 | $.map(searchString.split(''), function(e) { return RegExp.escape(e); }). 171 | join('.+?'); 172 | } 173 | return regexSearchString; 174 | } 175 | 176 | function highlight() { 177 | $('#full_list li:visible').each(function(n) { 178 | $(this).removeClass('even odd').addClass(n % 2 == 0 ? 'odd' : 'even'); 179 | }); 180 | } 181 | 182 | /** 183 | * Expands the tree to the target element and its immediate 184 | * children. 185 | */ 186 | function expandTo(path) { 187 | var $target = $(document.getElementById('object_' + path)); 188 | $target.addClass('clicked'); 189 | $target.removeClass('collapsed'); 190 | $target.parentsUntil('#full_list', 'li').removeClass('collapsed'); 191 | if($target[0]) { 192 | window.scrollTo(window.scrollX, $target.offset().top - 250); 193 | highlight(); 194 | } 195 | } 196 | 197 | function windowEvents(event) { 198 | var msg = event.data; 199 | if (msg.action === "expand") { 200 | expandTo(msg.path); 201 | } 202 | return false; 203 | } 204 | 205 | window.addEventListener("message", windowEvents, false); 206 | 207 | $(document).ready(function() { 208 | escapeShortcut(); 209 | navResizer(); 210 | enableLinks(); 211 | enableToggles(); 212 | populateSearchCache(); 213 | enableSearch(); 214 | }); 215 | 216 | })(); 217 | -------------------------------------------------------------------------------- /docs/method_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Method List 19 | 20 | 21 | 22 |
23 |
24 |

Method List

25 |
26 | 27 | 28 | Classes 29 | 30 | 31 | 32 | Methods 33 | 34 | 35 | 36 | Files 37 | 38 | 39 |
40 | 41 | 42 |
43 | 44 |
    45 | 46 | 47 |
  • 48 |
    49 | generate_icon 50 | IOSIconGenerator::Helpers 51 |
    52 |
  • 53 | 54 | 55 |
  • 56 |
    57 | image_sets 58 | IOSIconGenerator::Helpers 59 |
    60 |
  • 61 | 62 | 63 |
  • 64 |
    65 | mask_icon 66 | IOSIconGenerator::Helpers 67 |
    68 |
  • 69 | 70 | 71 |
  • 72 |
    73 | type_incompatible? 74 | IOSIconGenerator::Helpers 75 |
    76 |
  • 77 | 78 | 79 |
  • 80 |
    81 | which 82 | IOSIconGenerator::Helpers 83 |
    84 |
  • 85 | 86 | 87 | 88 |
89 |
90 | 91 | 92 | -------------------------------------------------------------------------------- /docs/top-level-namespace.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Top Level Namespace 8 | 9 | — Documentation by YARD 0.9.18 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 34 | 35 |
36 | 61 | 62 |

Top Level Namespace 63 | 64 | 65 | 66 |

67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
80 | 81 |

Defined Under Namespace

82 |

83 | 84 | 85 | Modules: IOSIconGenerator 86 | 87 | 88 | 89 | 90 |

91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 |
101 | 102 | 107 | 108 |
109 | 110 | -------------------------------------------------------------------------------- /ios_icon_generator.gemspec: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | lib = File.expand_path('lib', __dir__) 4 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 5 | require 'ios_icon_generator/version' 6 | 7 | Gem::Specification.new do |spec| 8 | spec.name = 'ios_icon_generator' 9 | spec.version = IOSIconGenerator::VERSION 10 | spec.authors = ['Stéphane Copin'] 11 | spec.email = ['stephane@fueled.com'] 12 | 13 | spec.summary = 'Generates icons based and apply masks to them easily.' 14 | spec.homepage = 'https://github.com/Fueled/ios-icon-generator' 15 | 16 | spec.files = Dir['lib/**/*.rb'] + Dir['vendor/**/*.json'] + %w[bin/icongen LICENSE README.md .yardopts] 17 | spec.license = 'Apache-2.0' 18 | spec.executables = %w[icongen] 19 | spec.require_paths = ['lib'] 20 | 21 | spec.metadata['yard.run'] = 'yri' 22 | 23 | spec.add_runtime_dependency 'colored2' 24 | spec.add_runtime_dependency 'hanami-cli' 25 | spec.add_runtime_dependency 'parallel' 26 | spec.add_runtime_dependency 'ruby-progressbar' 27 | spec.add_development_dependency 'aruba' 28 | spec.add_development_dependency 'bundler', '~> 2.0' 29 | spec.add_development_dependency 'codecov' 30 | spec.add_development_dependency 'danger' 31 | spec.add_development_dependency 'danger-rubocop' 32 | spec.add_development_dependency 'debase', '= 0.2.2' 33 | spec.add_development_dependency 'phashion' 34 | spec.add_development_dependency 'pry' 35 | spec.add_development_dependency 'rake', '~> 10.0' 36 | spec.add_development_dependency 'rspec', '~> 3.0' 37 | spec.add_development_dependency 'rubocop', '~> 0.64.0' 38 | spec.add_development_dependency 'ruby-debug-ide', '= 0.6.1' 39 | spec.add_development_dependency 'simplecov' 40 | spec.add_development_dependency 'simplecov-console' 41 | end 42 | -------------------------------------------------------------------------------- /lib/.yardoc/checksums: -------------------------------------------------------------------------------- 1 | ios_icon_generator/version.rb ce7d82f0b1be30d9858def51a225d6dafb93d75e 2 | ios_icon_generator.rb 45ea6b19c1aa3874baa79fa4082997d0b7426d5d 3 | ios_icon_generator/helpers/generate_icon.rb a63501ce864209c2ca2b7c011f54995d613113eb 4 | ios_icon_generator/helpers/image_sets_definition.rb e723c7bfc63acf388e22c6356bee903c4ec76fe6 5 | ios_icon_generator/helpers/mask_icon.rb 439c9ec9ce9b5d41fce8fa067b2e2b36670ad284 6 | ios_icon_generator/helpers/which.rb 8770c89d2fe92c51b54f3d3499cff7f93b114381 7 | -------------------------------------------------------------------------------- /lib/.yardoc/complete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/lib/.yardoc/complete -------------------------------------------------------------------------------- /lib/.yardoc/object_types: -------------------------------------------------------------------------------- 1 | { : root[;: module[ I"IOSIconGenerator:EFI"IOSIconGenerator::CLI;FI"$IOSIconGenerator::CLI::Commands;FI"IOSIconGenerator::Helpers;F: constant[I"IOSIconGenerator::VERSION;F: method[ 2 | I",IOSIconGenerator::Helpers.generate_icon;FI")IOSIconGenerator::Helpers.image_sets;FI"1IOSIconGenerator::Helpers.type_incompatible?;FI"(IOSIconGenerator::Helpers.mask_icon;FI"$IOSIconGenerator::Helpers.which;F -------------------------------------------------------------------------------- /lib/.yardoc/objects/root.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/lib/.yardoc/objects/root.dat -------------------------------------------------------------------------------- /lib/.yardoc/proxy_types: -------------------------------------------------------------------------------- 1 | { -------------------------------------------------------------------------------- /lib/ios_icon_generator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'ios_icon_generator/version' 18 | require 'rubygems' 19 | require 'colored2' 20 | require 'hanami/cli' 21 | 22 | # The IOSIconGenerator module 23 | module IOSIconGenerator 24 | # @private 25 | # :nodoc: 26 | module CLI 27 | # @private 28 | # :nodoc: 29 | module Commands 30 | extend Hanami::CLI::Registry 31 | end 32 | end 33 | 34 | ## 35 | # The helpers used by the commands of IOSIconGenerator. 36 | module Helpers 37 | end 38 | end 39 | 40 | require 'ios_icon_generator/cli/commands/generate' 41 | require 'ios_icon_generator/cli/commands/mask' 42 | require 'ios_icon_generator/cli/commands/stub' 43 | require 'ios_icon_generator/cli/commands/version' 44 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/cli/commands/generate.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'colored2' 18 | require 'parallel' 19 | require 'ruby-progressbar' 20 | require 'ios_icon_generator/helpers/generate_icon' 21 | require 'hanami/cli' 22 | 23 | module IOSIconGenerator 24 | module CLI 25 | module Commands 26 | class Generate < Hanami::CLI::Command 27 | desc 'Generate app icons' 28 | argument :icon_path, required: true, desc: 'The unmasked icon of any image file type. The icon must be at least 1024x1024.' 29 | argument :xcasset_folder, default: '.', desc: "The path to your .xcassets folder. \ 30 | If not specified, the appiconsets will be generated in the current folder and can be draged\'n\'dropped there in xcode" 31 | option :type, type: :array, default: %w[iphone], desc: 'Which target to generate the icons for. Can be "iphone", "ipad", "watch", "mac" or "carplay" or a combination of any of them, or "imessage"' 32 | option :parallel_processes, type: :integer, default: -1, desc: 'Number of processes to use to process the files. Defaults to -1, meaning the number of cores the machine. \ 33 | Set to 0 to disable parallel processing.' 34 | def call(icon_path:, xcasset_folder:, type:, **options) 35 | types = type.map(&:to_sym) 36 | 37 | progress_bar = ProgressBar.create(total: nil) 38 | 39 | parallel_processes = options.fetch(:parallel_processes).to_i 40 | parallel_processes = nil if parallel_processes == -1 41 | Helpers.generate_icon( 42 | icon_path: icon_path, 43 | output_folder: xcasset_folder, 44 | types: types, 45 | parallel_processes: parallel_processes, 46 | progress: lambda do |progress, total| 47 | progress_bar.total = total unless progress_bar.total 48 | progress_bar.increment if progress 49 | end 50 | ) 51 | puts 'Completed!'.green 52 | end 53 | end 54 | 55 | register 'generate', Commands::Generate 56 | end 57 | end 58 | end 59 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/cli/commands/mask.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'fileutils' 18 | require 'base64' 19 | require 'colored2' 20 | require 'parallel' 21 | require 'ruby-progressbar' 22 | require 'ios_icon_generator/helpers/mask_icon' 23 | require 'ios_icon_generator/helpers/check_dependencies' 24 | require 'hanami/cli' 25 | 26 | module IOSIconGenerator 27 | module CLI 28 | module Commands 29 | module Build 30 | class Icon < Hanami::CLI::Command 31 | desc 'Generate app icons' 32 | argument :appiconset_path, required: true, desc: 'The unmasked pdf icon. The icon must be at least 1024x1024' 33 | argument :output_path, default: '.', desc: "The path to your .xcassets folder. \ 34 | If not specified, the appiconsets will be generated in the current folder and can be draged\'n\'dropped there in xcode" 35 | option :suffix, default: 'Beta', desc: 'The prefix to add to the original app icon set' 36 | option :background_color, default: '#FFFFFF', desc: 'The background color of the mask' 37 | option :stroke_color, default: '#000000', desc: 'The stroke color of the mask' 38 | option :stroke_width_offset, type: :float, default: 0.01, desc: 'The width of the stroke used when generating the mask\'s background.' 39 | option :symbol, default: 'b', desc: 'The symbol to use to generate the mask.' 40 | option :symbol_color, default: '#7F0000', desc: 'The color of the symbol to use to generate the mask.' 41 | option :font, default: 'Helvetica', desc: 'The font to use to generate the symbol.' 42 | option :file, default: nil, desc: 'The path to an image representing the symbol to use to generate the mask.' 43 | option :x_size_ratio, type: :float, default: 0.54, desc: 'The x offset of the size of the mask.' 44 | option :y_size_ratio, type: :float, default: 0.54, desc: 'The y offset of the size of the mask.' 45 | option :size_offset, type: :float, default: 0.12, desc: 'The size offset to use when applying the symbol. 0.0 means it\'s scale to the full image, 1.0 means the symbol has the full size of the logo.' 46 | option :x_offset, type: :float, default: 0.11, desc: 'The x offset to use when applying the symbol. 0.0 means bottom, 1.0 means top.' 47 | option :y_offset, type: :float, default: 0.11, desc: 'The y offset to use when applying the symbol. 0.0 means left, 1.0 means top.' 48 | option :mask_shape, default: 'triangle', desc: 'The shape of the form. Can only be either of \'triangle\' or \'square\'.' 49 | option :parallel_processes, type: :integer, default: -1, desc: 'Number of processes to use to process the files. Defaults to -1, meaning the number of cores the machine. \ 50 | Set to 0 to disable parallel processing.' 51 | def call(appiconset_path:, output_path:, **options) 52 | raise 'There is no App icon set at the path specified.' unless Dir.exist?(appiconset_path) 53 | 54 | progress_bar = ProgressBar.create(total: nil) 55 | parallel_processes = options.fetch(:parallel_processes).to_i 56 | parallel_processes = nil if parallel_processes == -1 57 | Helpers.mask_icon( 58 | appiconset_path: appiconset_path, 59 | output_folder: output_path, 60 | mask: { 61 | background_color: options.fetch(:background_color), 62 | stroke_color: options.fetch(:stroke_color), 63 | stroke_width_offset: options.fetch(:stroke_width_offset)&.to_f, 64 | suffix: options.fetch(:suffix), 65 | symbol: options.fetch(:symbol), 66 | symbol_color: options.fetch(:symbol_color), 67 | font: options.fetch(:font), 68 | file: options[:file], 69 | x_size_ratio: options.fetch(:x_size_ratio)&.to_f, 70 | y_size_ratio: options.fetch(:y_size_ratio)&.to_f, 71 | size_offset: options.fetch(:size_offset)&.to_f, 72 | x_offset: options.fetch(:x_offset)&.to_f, 73 | y_offset: options.fetch(:y_offset)&.to_f, 74 | shape: options.fetch(:mask_shape)&.to_sym, 75 | }, 76 | parallel_processes: parallel_processes, 77 | progress: lambda do |progress, total| 78 | progress_bar.total = total unless progress_bar.total 79 | progress_bar.increment if progress 80 | end 81 | ) 82 | puts 'Completed!'.green 83 | end 84 | end 85 | end 86 | 87 | register 'mask', Build::Icon 88 | end 89 | end 90 | end 91 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/cli/commands/stub.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'colored2' 18 | require 'parallel' 19 | require 'ruby-progressbar' 20 | require 'ios_icon_generator/helpers/generate_icon' 21 | require 'ios_icon_generator/helpers/check_dependencies' 22 | require 'hanami/cli' 23 | 24 | module IOSIconGenerator 25 | module CLI 26 | module Commands 27 | class Stub < Hanami::CLI::Command 28 | desc 'Generate stub app icons' 29 | argument :text, required: true, desc: 'The text to use when generating the icon.' 30 | argument :xcasset_folder, default: '.', desc: "The path to your .xcassets folder. \ 31 | If not specified, the appiconsets will be generated in the current folder and can be draged\'n\'dropped there in xcode" 32 | option :background_color, default: '#FFFFFF', desc: 'The background color of the mask' 33 | option :symbol, default: 'b', desc: 'The symbol to use.' 34 | option :font, default: 'Helvetica', desc: 'The font to use to generate the symbol.' 35 | option :symbol_color, default: '#7F0000', desc: 'The color of the symbol to use to generate the mask.' 36 | option :stroke_color, default: '#000000', desc: 'The stroke color of the mask' 37 | option :stroke_width_offset, type: :float, default: 0.0, desc: 'The width of the stroke used when generating the symbol.' 38 | option :size_offset, type: :float, default: 0.5, desc: 'The point size used for the symbol, relative to the height of the icon. Values over 0.5 are not recommended.' 39 | option :x_offset, type: :float, default: 0.0, desc: 'The x offset to use when applying the symbol. 0.0 means bottom, 1.0 means top.' 40 | option :y_offset, type: :float, default: -0.05, desc: 'The y offset to use when applying the symbol. 0.0 means left, 1.0 means top.' 41 | option :type, type: :array, default: %w[iphone], desc: 'Which target to generate the icons for. Can be "iphone", "ipad", "watch", "mac" or "carplay" or a combination of any of them, or "imessage"' 42 | option :parallel_processes, type: :integer, default: -1, desc: 'Number of processes to use to process the files. Defaults to -1, meaning the number of cores the machine. \ 43 | Set to 0 to disable parallel processing.' 44 | def call(text:, xcasset_folder:, type:, **options) 45 | types = type.map(&:to_sym) 46 | 47 | progress_bar = ProgressBar.create(total: nil) 48 | 49 | parallel_processes = options.fetch(:parallel_processes).to_i 50 | parallel_processes = nil if parallel_processes == -1 51 | Helpers.generate_icon( 52 | icon_path: nil, 53 | output_folder: xcasset_folder, 54 | types: types, 55 | parallel_processes: parallel_processes, 56 | generate_icon: lambda do |_base_path, target_path, width, height| 57 | system( 58 | 'magick', 59 | '-size', 60 | "#{width}x#{height}", 61 | "xc:#{options.fetch(:background_color)}", 62 | '-strokewidth', 63 | (options.fetch(:stroke_width_offset).to_f * [width, height].min).to_s, 64 | '-stroke', 65 | (options.fetch(:stroke_width_offset).to_f.zero? ? 'none' : options.fetch(:stroke_color)).to_s, 66 | '-fill', 67 | options.fetch(:symbol_color), 68 | '-gravity', 69 | 'center', 70 | '-font', 71 | options.fetch(:font), 72 | '-pointsize', 73 | (height * options.fetch(:size_offset).to_f).to_s, 74 | '-annotate', 75 | "+#{width * options.fetch(:x_offset).to_f}+#{height * -options.fetch(:y_offset).to_f}", 76 | text, 77 | target_path 78 | ) 79 | end, 80 | progress: lambda do |progress, total| 81 | progress_bar.total = total unless progress_bar.total 82 | progress_bar.increment if progress 83 | end 84 | ) 85 | puts 'Completed!'.green 86 | end 87 | end 88 | 89 | register 'stub', Commands::Stub 90 | end 91 | end 92 | end 93 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/cli/commands/version.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'hanami/cli' 18 | 19 | module IOSIconGenerator 20 | module CLI 21 | module Commands 22 | class Version < Hanami::CLI::Command 23 | desc 'Print version' 24 | def call(*) 25 | puts IOSIconGenerator::VERSION 26 | end 27 | end 28 | 29 | register 'version', Commands::Version, aliases: ['v', '-v', '--version'] 30 | end 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/cli/runner.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'ios_icon_generator' 18 | 19 | module IOSIconGenerator 20 | module CLI 21 | class Runner 22 | def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel) 23 | @argv = argv 24 | @trace_enabled = argv.include?('--trace') 25 | @argv.reject! { |v| v == '--trace' } 26 | @argv = argv 27 | @stdin = stdin 28 | @stdout = stdout 29 | @stderr = stderr 30 | @kernel = kernel 31 | end 32 | 33 | def execute! 34 | exit_code = 35 | begin 36 | $stderr = @stderr 37 | $stdin = @stdin 38 | $stdout = @stdout 39 | 40 | Hanami::CLI.new(IOSIconGenerator::CLI::Commands).call(arguments: @argv) 41 | 42 | 0 43 | rescue StandardError => e 44 | if @trace_enabled 45 | @stderr.puts "ERROR: #{e.message}".red 46 | else 47 | @stderr.puts("#{e.backtrace.shift}: #{e.message} (#{e.class})") 48 | @stderr.puts(e.backtrace.map { |s| "\tfrom #{s}" }.join("\n")) 49 | end 50 | 1 51 | rescue SystemExit => e 52 | e.status 53 | ensure 54 | $stderr = STDERR 55 | $stdin = STDIN 56 | $stdout = STDOUT 57 | end 58 | 59 | # Proxy our exit code back to the injected kernel. 60 | @kernel.exit(exit_code) 61 | end 62 | end 63 | end 64 | end 65 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/helpers/check_dependencies.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'ios_icon_generator/helpers/which' 18 | 19 | module IOSIconGenerator 20 | module Helpers 21 | def self.check_dependencies(requires_ghostscript: false) 22 | raise "#{'ImageMagick'.blue.bold} is required. It can be installed via #{'homebrew'.bold.underlined} using #{'brew install imagemagick'.blue.bold.underlined}" unless Helpers.which('magick') 23 | raise "#{'GhostScript'.blue.bold} is required. It can be installed via #{'homebrew'.bold.underlined} using #{'brew install ghostscript'.blue.bold.underlined}" \ 24 | if requires_ghostscript && !Helpers.which('gs') 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/helpers/generate_icon.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'json' 18 | require 'fileutils' 19 | require 'ios_icon_generator/helpers/image_sets_definition' 20 | require 'ios_icon_generator/helpers/check_dependencies' 21 | 22 | module IOSIconGenerator 23 | module Helpers 24 | ## 25 | # Generate an icon using the base icon provided. 26 | # 27 | # If +icon_path+ is set to +nil+, the function expects +generate_icon+ to be set or the function will raise. 28 | # 29 | # @param [String, #read] icon_path The path to the icon to use as the base icon. 30 | # If specified, it must point to a valid image file, with a resolution over 1024x1024 when applicable. 31 | # If not specified, +generate_icon+ must be specified. 32 | # @param [String, #read] output_folder The folder to create the app icon set in. 33 | # @param [Array, #read] types The types to generate the sets of images for. Each type must be one of +:iphone+, +:ipad+, +:watch+, +mac+ or +carplay+, or it can be an array of just +:imessage+. 34 | # @param [Symbol, #read] parallel_processes The number of processes to use when generating the icons. 35 | # +nil+ means it'll use as many processes as they are cores on the machine. 36 | # +0+ will disables spawning any processes. 37 | # @param [Lambda(base_path [String], target_path [String], width [Float], height [Float]), #read] generate_icon The lambda that actually generates the icon. 38 | # If none is specified, and default one will be used. 39 | # It should take four parameters: 40 | # - +base_path+: The base path to the reference image to use to generate the new icon. If +icon_path+ is set to +nil+, the +base_path+ parameter will +nil+ as well. 41 | # - +target_path+: The path to generate the icon at. 42 | # - +width+: The width of the icon to generate. 43 | # - +height+: The height of the icon to generate. 44 | # @param [Lambda(progress [Int], total [Int]), #read] progress An optional progress block called when progress has been made generating the icons. 45 | # It should take two parameters: 46 | # - +progress+: An integer indicating the current progress out of +total+ 47 | # - +total+: An integer indicating the total progress 48 | # 49 | # @return [String] Return the path to the generated app icon set. 50 | def self.generate_icon(icon_path:, output_folder:, types:, parallel_processes: nil, generate_icon: nil, progress: nil) 51 | is_pdf = icon_path && File.extname(icon_path) == '.pdf' 52 | 53 | Helpers.check_dependencies(requires_ghostscript: is_pdf) 54 | 55 | if icon_path 56 | raise "There is no icon at #{icon_path}." unless File.exist?(icon_path) 57 | 58 | matches = /(\d+)x(\d+)/.match(`magick identify "#{icon_path}"`) 59 | raise 'Unable to verify icon. Please make sure it\'s a valid image file and try again.' if matches.nil? 60 | 61 | width, height = matches.captures 62 | raise 'Invalid image specified.' if width.nil? || height.nil? 63 | 64 | raise "The icon must at least be 1024x1024, it currently is #{width}x#{height}." unless width.to_i >= 1024 && height.to_i >= 1024 65 | elsif generate_icon.nil? 66 | raise 'icon_path has been set to nil, generate_icon must be specified' 67 | end 68 | 69 | appiconset_path = File.join(output_folder, "#{types.include?(:imessage) ? 'iMessage App Icon' : 'AppIcon'}.#{types.include?(:imessage) ? 'stickersiconset' : 'appiconset'}") 70 | 71 | FileUtils.mkdir_p(appiconset_path) 72 | 73 | get_icon_path = lambda { |width, height| 74 | return File.join(appiconset_path, "Icon-#{width.to_i}x#{height.to_i}.png") 75 | } 76 | 77 | generate_icon ||= lambda { |base_path, target_path, width, height| 78 | size = [width, height].max 79 | system( 80 | 'magick', 81 | 'convert', 82 | '-density', 83 | '400', 84 | base_path, 85 | '-colorspace', 86 | 'sRGB', 87 | '-type', 88 | 'truecolor', 89 | '-resize', "#{size}x#{size}", 90 | '-gravity', 91 | 'center', 92 | '-crop', 93 | "#{width}x#{height}+0+0", 94 | '+repage', 95 | target_path 96 | ) 97 | } 98 | 99 | types.each do |type1| 100 | types.each do |type2| 101 | raise "Incompatible types used together: #{type1} and #{type2}. These types cannot be added to the same sets; please call the command twice with each different type." if Helpers.type_incompatible?(type1, type2) 102 | end 103 | end 104 | 105 | images_sets = Helpers.image_sets(types) 106 | 107 | smaller_sizes = [] 108 | images_sets.each do |image| 109 | width, height = /(\d+(?:\.\d)?)x(\d+(?:\.\d)?)/.match(image['size'])&.captures 110 | scale, = /(\d+(?:\.\d)?)x/.match(image['scale'])&.captures 111 | raise "Invalid size parameter in Contents.json: #{image['size']}" if width.nil? || height.nil? || scale.nil? 112 | 113 | scale = scale.to_f 114 | width = width.to_f * scale 115 | height = height.to_f * scale 116 | 117 | target_path = get_icon_path.call(width, height) 118 | image['filename'] = File.basename(target_path) 119 | if width > 512 || height > 512 120 | generate_icon.call( 121 | icon_path, 122 | target_path, 123 | width, 124 | height 125 | ) 126 | else 127 | smaller_sizes << [width, height] 128 | end 129 | end 130 | 131 | total = smaller_sizes.count + 2 132 | progress&.call(nil, total) 133 | 134 | max_size = smaller_sizes.flatten.max 135 | temp_icon_path = File.join(output_folder, ".temp_icon#{is_pdf ? '.pdf' : '.png'}") 136 | begin 137 | system('magick', 'convert', '-density', '400', icon_path, '-colorspace', 'sRGB', '-type', 'truecolor', '-scale', "#{max_size}x#{max_size}", temp_icon_path) if icon_path 138 | progress&.call(1, total) 139 | Parallel.each( 140 | smaller_sizes, 141 | in_processes: parallel_processes, 142 | finish: lambda do |_item, i, _result| 143 | progress&.call(i + 1, total) 144 | end 145 | ) do |width, height| 146 | generate_icon.call( 147 | temp_icon_path, 148 | get_icon_path.call(width, height), 149 | width, 150 | height 151 | ) 152 | end 153 | ensure 154 | FileUtils.rm(temp_icon_path) if File.exist?(temp_icon_path) 155 | end 156 | 157 | contents_json = { 158 | images: images_sets, 159 | info: { 160 | version: 1, 161 | author: 'xcode', 162 | }, 163 | } 164 | 165 | File.write(File.join(appiconset_path, 'Contents.json'), JSON.pretty_generate(contents_json)) 166 | 167 | progress&.call(total - 1, total) 168 | 169 | appiconset_path 170 | end 171 | end 172 | end 173 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/helpers/image_sets_definition.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'json' 18 | 19 | module IOSIconGenerator 20 | module Helpers 21 | ## 22 | # Get the image sets for the given types. 23 | # 24 | # @param [Symbol, #read] types The types to return the sets of image for. 25 | # This method won't fail if the types aren't compatible as defined by +type_incompatible?+ 26 | # 27 | # @return [Array>] The sets of image for the given types. 28 | # Each hash will at least contain a +size+ [String] key, that has the format +x+ 29 | def self.image_sets(types) 30 | types.flat_map do |type| 31 | contents_path = File.expand_path(File.join(File.dirname(__FILE__), "../../../vendor/Contents-#{type}.json")) 32 | raise "Unknown type #{type}" unless File.exist?(contents_path) 33 | 34 | contents_json = JSON.parse(File.read(contents_path)) 35 | contents_json['images'] 36 | end 37 | end 38 | 39 | ## 40 | # Check if the given types are compatible (if they can be used in the same set) 41 | # 42 | # @param [Symbol, #read] lhs The first type to check against the second type. 43 | # @param [Symbol, #read] rhs The second type to check against the first type. 44 | # 45 | # @return [Boolean] +true+ if the given are compatible together, +false+ otherwise 46 | def self.type_incompatible?(lhs, rhs) 47 | (lhs == :imessage && rhs != :imessage) || (lhs != :imessage && rhs == :imessage) 48 | end 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/helpers/mask_icon.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'json' 18 | require 'base64' 19 | require 'fileutils' 20 | require 'ios_icon_generator/helpers/check_dependencies' 21 | 22 | module IOSIconGenerator 23 | module Helpers 24 | ## 25 | # Mask an icon using the parameters provided. 26 | # 27 | # The mask is for now always generated in the bottom left corner of the image. 28 | # 29 | # @param [String, #read] appiconset_path The path of the original app icon set to use to generate the new one. 30 | # @param [String, #read] output_folder The folder to create the new app icon set in. 31 | # @param [Hash, #read] mask A hash representing parameters for creating the mask. 32 | # The Hash may contain the following values: 33 | # - +background_color+: The background color to use when generating the mask 34 | # - +stroke_color+: The stroke color to use when generating the mask. Used for the outline of the mask. 35 | # - +stroke_width_offset+: The stroke width of the mask, offset to the image's minimum dimension (width or height). 36 | # 1.0 means the stroke will have the full width/height of the image 37 | # - +suffix+: The suffix to use when generating the new mask 38 | # - +file+: The file to use when generating the new mask. This file should be an image, and it will be overlayed over the background. 39 | # - +symbol+: The symbol to use when generating the new mask 40 | # - +symbol_color+: The color to use for the symbol 41 | # - +font+: The font to use for the symbol 42 | # - +x_size_ratio+: The size ratio (of the width of the image) to use when generating the mask. 1.0 means the full width, 0.5 means half-width. 43 | # - +y_size_ratio+: The size ratio (of the height of the image) to use when generating the mask. 1.0 means the full height, 0.5 means half-height. 44 | # - +size_offset+: The size ratio (of the width and height) to use when generating the symbol or file. 1.0 means the full width and height, 0.5 means half-width and half-height. 45 | # - +x_offset+: The X offset (of the width of the image) to use when generating the symbol or file. 1.0 means the full width, 0.5 means half-width. 46 | # - +y_offset+: The Y offset (of the width of the image) to use when generating the symbol or file. 1.0 means the full height, 0.5 means half-height. 47 | # - +shape+: The shape to use when generating the mask. Can be either +:triangle+ or +:square+. 48 | # @param [Symbol, #read] parallel_processes The number of processes to use when generating the icons. 49 | # +nil+ means it'll use as many processes as they are cores on the machine. 50 | # +0+ will disables spawning any processes. 51 | # @param [Lambda(progress [Int], total [Int]), #read] progress An optional progress block called when progress has been made generating the icons. 52 | # It should take two parameters: 53 | # - +progress+: An integer indicating the current progress out of +total+ 54 | # - +total+: An integer indicating the total progress 55 | # 56 | # @return [String] Return the path to the generated app icon set. 57 | def self.mask_icon( 58 | appiconset_path:, 59 | output_folder:, 60 | mask: { 61 | background_color: '#FFFFFF', 62 | stroke_color: '#000000', 63 | stroke_width_offset: 0.1, 64 | suffix: 'Beta', 65 | symbol: 'b', 66 | symbol_color: '#7F0000', 67 | font: 'Helvetica', 68 | x_size_ratio: 0.54, 69 | y_size_ratio: 0.54, 70 | size_offset: 0.0, 71 | x_offset: 0.0, 72 | y_offset: 0.0, 73 | shape: 'triangle', 74 | }, 75 | parallel_processes: nil, 76 | progress: nil 77 | ) 78 | Helpers.check_dependencies 79 | 80 | extension = File.extname(appiconset_path) 81 | output_folder = File.join(output_folder, "#{File.basename(appiconset_path, extension)}-#{mask[:suffix]}#{extension}") 82 | 83 | FileUtils.mkdir_p(output_folder) 84 | 85 | contents_path = File.join(appiconset_path, 'Contents.json') 86 | raise "Contents.json file not found in #{appiconset_path}" unless File.exist?(contents_path) 87 | 88 | json_content = JSON.parse(File.read(contents_path)) 89 | progress&.call(nil, json_content['images'].count) 90 | Parallel.each( 91 | json_content['images'], 92 | in_processes: parallel_processes, 93 | finish: lambda do |_item, i, result| 94 | json_content['images'][i]['filename'] = result 95 | progress&.call(i, json_content['images'].count) 96 | end 97 | ) do |image| 98 | width, height = /(\d+(?:\.\d)?)x(\d+(?:\.\d)?)/.match(image['size'])&.captures 99 | scale, = /(\d+(?:\.\d)?)x/.match(image['scale'])&.captures 100 | raise "Invalid size parameter in Contents.json: #{image['size']}" if width.nil? || height.nil? || scale.nil? 101 | 102 | scale = scale.to_f 103 | width = width.to_f * scale 104 | height = height.to_f * scale 105 | 106 | mask_size_width = width * mask[:x_size_ratio].to_f 107 | mask_size_height = height * mask[:y_size_ratio].to_f 108 | 109 | extension = File.extname(image['filename']) 110 | icon_output = "#{File.basename(image['filename'], extension)}-#{mask[:suffix]}#{extension}" 111 | icon_output_path = File.join(output_folder, icon_output) 112 | 113 | draw_shape_parameters = "-strokewidth '#{(mask[:stroke_width_offset] || 0) * [width, height].min}' \ 114 | -stroke '#{mask[:stroke_width_offset].zero? ? 'none' : (mask[:stroke_color] || '#000000')}' \ 115 | -fill '#{mask[:background_color] || '#FFFFFF'}'" 116 | draw_shape = 117 | case mask[:shape] 118 | when :triangle 119 | "-draw \"polyline -#{width},#{height - mask_size_height} 0,#{height - mask_size_height} #{mask_size_width},#{height} #{mask_size_width},#{height * 2.0} -#{width},#{height * 2.0}\"" 120 | when :square 121 | "-draw \"rectangle -#{width},#{height * 2.0} #{mask_size_height},#{width - mask_size_width}\"" 122 | else 123 | raise "Unknown mask shape: #{mask[:shape]}" 124 | end 125 | 126 | draw_symbol = 127 | if mask[:file] 128 | "\\( -background none \ 129 | -density 1536 \ 130 | -resize #{width * mask[:size_offset]}x#{height} \ 131 | \"#{mask[:file]}\" \ 132 | -geometry +#{width * mask[:x_offset]}+#{height * mask[:y_offset]} \\) \ 133 | -gravity southwest \ 134 | -composite" 135 | else 136 | "-strokewidth 0 \ 137 | -stroke none \ 138 | -fill '#{mask[:symbol_color] || '#7F0000'}' \ 139 | -font '#{mask[:font]}' \ 140 | -pointsize #{height * mask[:size_offset] * 2.0} \ 141 | -annotate +#{width * mask[:x_offset]}+#{height - height * mask[:y_offset]} '#{mask[:symbol]}'" 142 | end 143 | system("convert '#{File.join(appiconset_path, image['filename'])}' #{draw_shape_parameters} #{draw_shape} #{draw_symbol} '#{icon_output_path}'") 144 | 145 | next icon_output 146 | end 147 | 148 | File.write(File.join(output_folder, 'Contents.json'), JSON.pretty_generate(json_content)) 149 | 150 | output_folder 151 | end 152 | end 153 | end 154 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/helpers/which.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | module IOSIconGenerator 18 | module Helpers 19 | ## 20 | # Cross-platform way of finding an executable in the +$PATH+. 21 | # 22 | # From http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby 23 | # 24 | # @param cmd [String] The name of the command to search the path for. 25 | # 26 | # @return [String] The full path to the command if found, and +nil+ otherwise. 27 | def self.which(cmd) 28 | exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] 29 | ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| 30 | exts.each do |ext| 31 | exe = File.join(path, "#{cmd}#{ext}") 32 | return exe if File.executable?(exe) && !File.directory?(exe) 33 | end 34 | end 35 | nil 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /lib/ios_icon_generator/version.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | module IOSIconGenerator 18 | ## 19 | # The current version of the gem. 20 | # 21 | VERSION = '0.1.3' 22 | end 23 | -------------------------------------------------------------------------------- /spec/icon_generator_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'spec_helper.rb' 18 | require 'phashion' 19 | require 'fileutils' 20 | require 'json' 21 | 22 | resources_path = File.expand_path(File.join(File.dirname(__FILE__), 'resources')) 23 | 24 | RSpec.shared_examples :icon_generation_examples do |command, parameter, options = nil, result_folder = nil| 25 | it('executes successfully') do 26 | FileUtils.rm_rf(File.join(resources_path, 'generated')) 27 | run_command( 28 | "icongen \ 29 | #{command} '#{parameter}' \ 30 | '#{File.join(resources_path, "generated/#{result_folder || command}.xcassets")}' \ 31 | #{options} \ 32 | --parallel-processes=0" 33 | ) 34 | expect(last_command_started).to be_successfully_executed 35 | end 36 | it('has the right file structure') do 37 | generated_relative_paths = Dir.glob(File.join(resources_path, "generated/#{result_folder || command}.xcassets/**/*")).map do |path| 38 | Pathname.new(path).relative_path_from(Pathname.new(File.join(resources_path, 'generated'))).to_s 39 | end 40 | expected_relative_paths = Dir.glob(File.join(resources_path, "expected/#{result_folder || command}.xcassets/**/*")).map do |path| 41 | Pathname.new(path).relative_path_from(Pathname.new(File.join(resources_path, 'expected'))).to_s 42 | end 43 | expect(generated_relative_paths.sort).to match_array(expected_relative_paths.sort) 44 | end 45 | it('creates the proper icons') do 46 | icons = Dir.glob(File.join(resources_path, "expected/#{result_folder || command}.xcassets/**/*.png")) 47 | expect(icons).to_not match_array([]) 48 | icons.each do |expected_path| 49 | relative_path = Pathname.new(expected_path).relative_path_from(Pathname.new(File.join(resources_path, 'expected'))).to_s 50 | generated_path = File.join(resources_path, 'generated', relative_path) 51 | expect(File).to exist(generated_path) 52 | generated_image = Phashion::Image.new(generated_path) 53 | expected_image = Phashion::Image.new(expected_path) 54 | expect(generated_image.duplicate?(expected_image, threshold: 1)).to be true # Not sure if it should be 1 (a very small difference) or 0 (identical), this will be determined by how the CLI evolves 55 | end 56 | end 57 | it('generate a valid contents.json') do 58 | generated_contents_json = Dir.glob(File.join(resources_path, "generated/#{result_folder || command}.xcassets/**/Contents.json")).first 59 | expected_contents_json = Dir.glob(File.join(resources_path, "expected/#{result_folder || command}.xcassets/**/Contents.json")).first 60 | expect(JSON.parse(File.read(generated_contents_json))).to match_array(JSON.parse(File.read(expected_contents_json))) 61 | end 62 | it('generate a pretty printed contents.json') do 63 | generated_contents_json = Dir.glob(File.join(resources_path, "generated/#{result_folder || command}.xcassets/**/Contents.json")).first 64 | content = File.read(generated_contents_json) 65 | expect(content).to be == JSON.pretty_generate(JSON.parse(content)) 66 | end 67 | end 68 | 69 | RSpec.describe IOSIconGenerator, type: :aruba do 70 | it 'has a version number' do 71 | expect(IOSIconGenerator::VERSION).not_to be nil 72 | end 73 | describe 'version' do 74 | before(:each) do 75 | run_command('icongen version') 76 | end 77 | it('print the right version') do 78 | expect(last_command_started.stdout.strip).to start_with(IOSIconGenerator::VERSION) 79 | end 80 | end 81 | 82 | describe 'generate' do 83 | it('fails if the icon is unknown') do 84 | FileUtils.rm_rf(File.join(resources_path, 'generated')) 85 | run_command( 86 | "icongen \ 87 | generate '' \ 88 | '#{File.join(resources_path, 'generated/error.xcassets')}'" 89 | ) 90 | expect(last_command_started).to_not be_successfully_executed 91 | end 92 | it('fails if the icon is invalid') do 93 | FileUtils.rm_rf(File.join(resources_path, 'generated')) 94 | run_command( 95 | "icongen \ 96 | generate '/test.pdf' \ 97 | '#{File.join(resources_path, 'generated/error.xcassets')}'" 98 | ) 99 | expect(last_command_started).to_not be_successfully_executed 100 | end 101 | context 'a stub' do 102 | include_examples :icon_generation_examples, 'stub', 'A', '--type=iphone,ipad,watch,mac,carplay' 103 | end 104 | context 'an icon' do 105 | include_examples :icon_generation_examples, 'generate', File.join(resources_path, 'generate.pdf'), '--type=iphone,ipad,watch,mac,carplay' 106 | end 107 | end 108 | describe 'mask' do 109 | context 'a triangle mask from a stub' do 110 | include_examples :icon_generation_examples, 111 | 'mask', 112 | File.join(resources_path, 'expected/stub.xcassets/AppIcon.appiconset'), 113 | nil, 114 | 'mask-triangle-stub' 115 | end 116 | context 'a triangle mask from a generated icon' do 117 | include_examples :icon_generation_examples, 118 | 'mask', 119 | File.join(resources_path, 'expected/generate.xcassets/AppIcon.appiconset'), 120 | nil, 121 | 'mask-triangle-generated' 122 | end 123 | context 'a square mask from a stub' do 124 | include_examples :icon_generation_examples, 125 | 'mask', 126 | File.join(resources_path, 'expected/stub.xcassets/AppIcon.appiconset'), 127 | '--mask-shape=square \ 128 | --x-size-ratio=0.30 \ 129 | --y-size-ratio=0.30 \ 130 | --size-offset=0.11 \ 131 | --x-offset=0.1 \ 132 | --y-offset=0.1 \ 133 | --background-color=\'#A36AE9\' \ 134 | --stroke-width-offset=0 \ 135 | --font=Symbol \ 136 | --symbol-color=\'#FFFFFF\'', 137 | 'mask-square-stub' 138 | end 139 | context 'a square mask from a generated icon' do 140 | include_examples :icon_generation_examples, 141 | 'mask', 142 | File.join(resources_path, 'expected/generate.xcassets/AppIcon.appiconset'), 143 | '--mask-shape=square \ 144 | --x-size-ratio=0.30 \ 145 | --y-size-ratio=0.30 \ 146 | --size-offset=0.11 \ 147 | --x-offset=0.1 \ 148 | --y-offset=0.1 \ 149 | --background-color=\'#A36AE9\' \ 150 | --stroke-width-offset=0 \ 151 | --font=Symbol \ 152 | --symbol-color=\'#FFFFFF\'', 153 | 'mask-square-generated' 154 | end 155 | end 156 | end 157 | -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "scale": "2x", 7 | "filename": "Icon-40x40.png" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "scale": "3x", 13 | "filename": "Icon-60x60.png" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "scale": "2x", 19 | "filename": "Icon-58x58.png" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "scale": "3x", 25 | "filename": "Icon-87x87.png" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "scale": "2x", 31 | "filename": "Icon-80x80.png" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "scale": "3x", 37 | "filename": "Icon-120x120.png" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "scale": "2x", 43 | "filename": "Icon-120x120.png" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "scale": "3x", 49 | "filename": "Icon-180x180.png" 50 | }, 51 | { 52 | "size": "1024x1024", 53 | "idiom": "ios-marketing", 54 | "scale": "1x", 55 | "filename": "Icon-1024x1024.png" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "scale": "1x", 61 | "filename": "Icon-20x20.png" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "scale": "2x", 67 | "filename": "Icon-40x40.png" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "scale": "1x", 73 | "filename": "Icon-29x29.png" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "scale": "2x", 79 | "filename": "Icon-58x58.png" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "scale": "1x", 85 | "filename": "Icon-40x40.png" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "scale": "2x", 91 | "filename": "Icon-80x80.png" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "scale": "1x", 97 | "filename": "Icon-76x76.png" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "scale": "2x", 103 | "filename": "Icon-152x152.png" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "scale": "2x", 109 | "filename": "Icon-167x167.png" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "scale": "1x", 115 | "filename": "Icon-1024x1024.png" 116 | }, 117 | { 118 | "size": "24x24", 119 | "idiom": "watch", 120 | "scale": "2x", 121 | "role": "notificationCenter", 122 | "subtype": "38mm", 123 | "filename": "Icon-48x48.png" 124 | }, 125 | { 126 | "size": "27.5x27.5", 127 | "idiom": "watch", 128 | "scale": "2x", 129 | "role": "notificationCenter", 130 | "subtype": "42mm", 131 | "filename": "Icon-55x55.png" 132 | }, 133 | { 134 | "size": "29x29", 135 | "idiom": "watch", 136 | "role": "companionSettings", 137 | "scale": "2x", 138 | "filename": "Icon-58x58.png" 139 | }, 140 | { 141 | "size": "29x29", 142 | "idiom": "watch", 143 | "role": "companionSettings", 144 | "scale": "3x", 145 | "filename": "Icon-87x87.png" 146 | }, 147 | { 148 | "size": "40x40", 149 | "idiom": "watch", 150 | "scale": "2x", 151 | "role": "appLauncher", 152 | "subtype": "38mm", 153 | "filename": "Icon-80x80.png" 154 | }, 155 | { 156 | "size": "44x44", 157 | "idiom": "watch", 158 | "scale": "2x", 159 | "role": "appLauncher", 160 | "subtype": "40mm", 161 | "filename": "Icon-88x88.png" 162 | }, 163 | { 164 | "size": "50x50", 165 | "idiom": "watch", 166 | "scale": "2x", 167 | "role": "appLauncher", 168 | "subtype": "44mm", 169 | "filename": "Icon-100x100.png" 170 | }, 171 | { 172 | "size": "86x86", 173 | "idiom": "watch", 174 | "scale": "2x", 175 | "role": "quickLook", 176 | "subtype": "38mm", 177 | "filename": "Icon-172x172.png" 178 | }, 179 | { 180 | "size": "98x98", 181 | "idiom": "watch", 182 | "scale": "2x", 183 | "role": "quickLook", 184 | "subtype": "42mm", 185 | "filename": "Icon-196x196.png" 186 | }, 187 | { 188 | "size": "108x108", 189 | "idiom": "watch", 190 | "scale": "2x", 191 | "role": "quickLook", 192 | "subtype": "44mm", 193 | "filename": "Icon-216x216.png" 194 | }, 195 | { 196 | "size": "1024x1024", 197 | "idiom": "watch-marketing", 198 | "scale": "1x", 199 | "filename": "Icon-1024x1024.png" 200 | }, 201 | { 202 | "size": "16x16", 203 | "idiom": "mac", 204 | "scale": "1x", 205 | "filename": "Icon-16x16.png" 206 | }, 207 | { 208 | "size": "16x16", 209 | "idiom": "mac", 210 | "scale": "2x", 211 | "filename": "Icon-32x32.png" 212 | }, 213 | { 214 | "size": "32x32", 215 | "idiom": "mac", 216 | "scale": "1x", 217 | "filename": "Icon-32x32.png" 218 | }, 219 | { 220 | "size": "32x32", 221 | "idiom": "mac", 222 | "scale": "2x", 223 | "filename": "Icon-64x64.png" 224 | }, 225 | { 226 | "size": "128x128", 227 | "idiom": "mac", 228 | "scale": "1x", 229 | "filename": "Icon-128x128.png" 230 | }, 231 | { 232 | "size": "128x128", 233 | "idiom": "mac", 234 | "scale": "2x", 235 | "filename": "Icon-256x256.png" 236 | }, 237 | { 238 | "size": "256x256", 239 | "idiom": "mac", 240 | "scale": "1x", 241 | "filename": "Icon-256x256.png" 242 | }, 243 | { 244 | "size": "256x256", 245 | "idiom": "mac", 246 | "scale": "2x", 247 | "filename": "Icon-512x512.png" 248 | }, 249 | { 250 | "size": "512x512", 251 | "idiom": "mac", 252 | "scale": "1x", 253 | "filename": "Icon-512x512.png" 254 | }, 255 | { 256 | "size": "512x512", 257 | "idiom": "mac", 258 | "scale": "2x", 259 | "filename": "Icon-1024x1024.png" 260 | }, 261 | { 262 | "size": "60x60", 263 | "idiom": "car", 264 | "scale": "2x", 265 | "filename": "Icon-120x120.png" 266 | }, 267 | { 268 | "size": "60x60", 269 | "idiom": "car", 270 | "scale": "3x", 271 | "filename": "Icon-180x180.png" 272 | } 273 | ], 274 | "info": { 275 | "version": 1, 276 | "author": "xcode" 277 | } 278 | } -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-100x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-100x100.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-1024x1024.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-120x120.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-128x128.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-152x152.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-167x167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-167x167.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-16x16.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-172x172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-172x172.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-180x180.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-196x196.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-20x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-20x20.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-216x216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-216x216.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-256x256.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-29x29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-29x29.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-32x32.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-40x40.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-48x48.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-512x512.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-55x55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-55x55.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-58x58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-58x58.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-60x60.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-64x64.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-76x76.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-80x80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-80x80.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-87x87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-87x87.png -------------------------------------------------------------------------------- /spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-88x88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/generate.xcassets/AppIcon.appiconset/Icon-88x88.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "scale": "2x", 7 | "filename": "Icon-40x40-Beta.png" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "scale": "3x", 13 | "filename": "Icon-60x60-Beta.png" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "scale": "2x", 19 | "filename": "Icon-58x58-Beta.png" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "scale": "3x", 25 | "filename": "Icon-87x87-Beta.png" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "scale": "2x", 31 | "filename": "Icon-80x80-Beta.png" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "scale": "3x", 37 | "filename": "Icon-120x120-Beta.png" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "scale": "2x", 43 | "filename": "Icon-120x120-Beta.png" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "scale": "3x", 49 | "filename": "Icon-180x180-Beta.png" 50 | }, 51 | { 52 | "size": "1024x1024", 53 | "idiom": "ios-marketing", 54 | "scale": "1x", 55 | "filename": "Icon-1024x1024-Beta.png" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "scale": "1x", 61 | "filename": "Icon-20x20-Beta.png" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "scale": "2x", 67 | "filename": "Icon-40x40-Beta.png" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "scale": "1x", 73 | "filename": "Icon-29x29-Beta.png" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "scale": "2x", 79 | "filename": "Icon-58x58-Beta.png" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "scale": "1x", 85 | "filename": "Icon-40x40-Beta.png" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "scale": "2x", 91 | "filename": "Icon-80x80-Beta.png" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "scale": "1x", 97 | "filename": "Icon-76x76-Beta.png" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "scale": "2x", 103 | "filename": "Icon-152x152-Beta.png" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "scale": "2x", 109 | "filename": "Icon-167x167-Beta.png" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "scale": "1x", 115 | "filename": "Icon-1024x1024-Beta.png" 116 | }, 117 | { 118 | "size": "24x24", 119 | "idiom": "watch", 120 | "scale": "2x", 121 | "role": "notificationCenter", 122 | "subtype": "38mm", 123 | "filename": "Icon-48x48-Beta.png" 124 | }, 125 | { 126 | "size": "27.5x27.5", 127 | "idiom": "watch", 128 | "scale": "2x", 129 | "role": "notificationCenter", 130 | "subtype": "42mm", 131 | "filename": "Icon-55x55-Beta.png" 132 | }, 133 | { 134 | "size": "29x29", 135 | "idiom": "watch", 136 | "role": "companionSettings", 137 | "scale": "2x", 138 | "filename": "Icon-58x58-Beta.png" 139 | }, 140 | { 141 | "size": "29x29", 142 | "idiom": "watch", 143 | "role": "companionSettings", 144 | "scale": "3x", 145 | "filename": "Icon-87x87-Beta.png" 146 | }, 147 | { 148 | "size": "40x40", 149 | "idiom": "watch", 150 | "scale": "2x", 151 | "role": "appLauncher", 152 | "subtype": "38mm", 153 | "filename": "Icon-80x80-Beta.png" 154 | }, 155 | { 156 | "size": "44x44", 157 | "idiom": "watch", 158 | "scale": "2x", 159 | "role": "appLauncher", 160 | "subtype": "40mm", 161 | "filename": "Icon-88x88-Beta.png" 162 | }, 163 | { 164 | "size": "50x50", 165 | "idiom": "watch", 166 | "scale": "2x", 167 | "role": "appLauncher", 168 | "subtype": "44mm", 169 | "filename": "Icon-100x100-Beta.png" 170 | }, 171 | { 172 | "size": "86x86", 173 | "idiom": "watch", 174 | "scale": "2x", 175 | "role": "quickLook", 176 | "subtype": "38mm", 177 | "filename": "Icon-172x172-Beta.png" 178 | }, 179 | { 180 | "size": "98x98", 181 | "idiom": "watch", 182 | "scale": "2x", 183 | "role": "quickLook", 184 | "subtype": "42mm", 185 | "filename": "Icon-196x196-Beta.png" 186 | }, 187 | { 188 | "size": "108x108", 189 | "idiom": "watch", 190 | "scale": "2x", 191 | "role": "quickLook", 192 | "subtype": "44mm", 193 | "filename": "Icon-216x216-Beta.png" 194 | }, 195 | { 196 | "size": "1024x1024", 197 | "idiom": "watch-marketing", 198 | "scale": "1x", 199 | "filename": "Icon-1024x1024-Beta.png" 200 | }, 201 | { 202 | "size": "16x16", 203 | "idiom": "mac", 204 | "scale": "1x", 205 | "filename": "Icon-16x16-Beta.png" 206 | }, 207 | { 208 | "size": "16x16", 209 | "idiom": "mac", 210 | "scale": "2x", 211 | "filename": "Icon-32x32-Beta.png" 212 | }, 213 | { 214 | "size": "32x32", 215 | "idiom": "mac", 216 | "scale": "1x", 217 | "filename": "Icon-32x32-Beta.png" 218 | }, 219 | { 220 | "size": "32x32", 221 | "idiom": "mac", 222 | "scale": "2x", 223 | "filename": "Icon-64x64-Beta.png" 224 | }, 225 | { 226 | "size": "128x128", 227 | "idiom": "mac", 228 | "scale": "1x", 229 | "filename": "Icon-128x128-Beta.png" 230 | }, 231 | { 232 | "size": "128x128", 233 | "idiom": "mac", 234 | "scale": "2x", 235 | "filename": "Icon-256x256-Beta.png" 236 | }, 237 | { 238 | "size": "256x256", 239 | "idiom": "mac", 240 | "scale": "1x", 241 | "filename": "Icon-256x256-Beta.png" 242 | }, 243 | { 244 | "size": "256x256", 245 | "idiom": "mac", 246 | "scale": "2x", 247 | "filename": "Icon-512x512-Beta.png" 248 | }, 249 | { 250 | "size": "512x512", 251 | "idiom": "mac", 252 | "scale": "1x", 253 | "filename": "Icon-512x512-Beta.png" 254 | }, 255 | { 256 | "size": "512x512", 257 | "idiom": "mac", 258 | "scale": "2x", 259 | "filename": "Icon-1024x1024-Beta.png" 260 | }, 261 | { 262 | "size": "60x60", 263 | "idiom": "car", 264 | "scale": "2x", 265 | "filename": "Icon-120x120-Beta.png" 266 | }, 267 | { 268 | "size": "60x60", 269 | "idiom": "car", 270 | "scale": "3x", 271 | "filename": "Icon-180x180-Beta.png" 272 | } 273 | ], 274 | "info": { 275 | "version": 1, 276 | "author": "xcode" 277 | } 278 | } -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-generated.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "scale": "2x", 7 | "filename": "Icon-40x40-Beta.png" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "scale": "3x", 13 | "filename": "Icon-60x60-Beta.png" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "scale": "2x", 19 | "filename": "Icon-58x58-Beta.png" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "scale": "3x", 25 | "filename": "Icon-87x87-Beta.png" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "scale": "2x", 31 | "filename": "Icon-80x80-Beta.png" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "scale": "3x", 37 | "filename": "Icon-120x120-Beta.png" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "scale": "2x", 43 | "filename": "Icon-120x120-Beta.png" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "scale": "3x", 49 | "filename": "Icon-180x180-Beta.png" 50 | }, 51 | { 52 | "size": "1024x1024", 53 | "idiom": "ios-marketing", 54 | "scale": "1x", 55 | "filename": "Icon-1024x1024-Beta.png" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "scale": "1x", 61 | "filename": "Icon-20x20-Beta.png" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "scale": "2x", 67 | "filename": "Icon-40x40-Beta.png" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "scale": "1x", 73 | "filename": "Icon-29x29-Beta.png" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "scale": "2x", 79 | "filename": "Icon-58x58-Beta.png" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "scale": "1x", 85 | "filename": "Icon-40x40-Beta.png" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "scale": "2x", 91 | "filename": "Icon-80x80-Beta.png" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "scale": "1x", 97 | "filename": "Icon-76x76-Beta.png" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "scale": "2x", 103 | "filename": "Icon-152x152-Beta.png" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "scale": "2x", 109 | "filename": "Icon-167x167-Beta.png" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "scale": "1x", 115 | "filename": "Icon-1024x1024-Beta.png" 116 | }, 117 | { 118 | "size": "24x24", 119 | "idiom": "watch", 120 | "scale": "2x", 121 | "role": "notificationCenter", 122 | "subtype": "38mm", 123 | "filename": "Icon-48x48-Beta.png" 124 | }, 125 | { 126 | "size": "27.5x27.5", 127 | "idiom": "watch", 128 | "scale": "2x", 129 | "role": "notificationCenter", 130 | "subtype": "42mm", 131 | "filename": "Icon-55x55-Beta.png" 132 | }, 133 | { 134 | "size": "29x29", 135 | "idiom": "watch", 136 | "role": "companionSettings", 137 | "scale": "2x", 138 | "filename": "Icon-58x58-Beta.png" 139 | }, 140 | { 141 | "size": "29x29", 142 | "idiom": "watch", 143 | "role": "companionSettings", 144 | "scale": "3x", 145 | "filename": "Icon-87x87-Beta.png" 146 | }, 147 | { 148 | "size": "40x40", 149 | "idiom": "watch", 150 | "scale": "2x", 151 | "role": "appLauncher", 152 | "subtype": "38mm", 153 | "filename": "Icon-80x80-Beta.png" 154 | }, 155 | { 156 | "size": "44x44", 157 | "idiom": "watch", 158 | "scale": "2x", 159 | "role": "appLauncher", 160 | "subtype": "40mm", 161 | "filename": "Icon-88x88-Beta.png" 162 | }, 163 | { 164 | "size": "50x50", 165 | "idiom": "watch", 166 | "scale": "2x", 167 | "role": "appLauncher", 168 | "subtype": "44mm", 169 | "filename": "Icon-100x100-Beta.png" 170 | }, 171 | { 172 | "size": "86x86", 173 | "idiom": "watch", 174 | "scale": "2x", 175 | "role": "quickLook", 176 | "subtype": "38mm", 177 | "filename": "Icon-172x172-Beta.png" 178 | }, 179 | { 180 | "size": "98x98", 181 | "idiom": "watch", 182 | "scale": "2x", 183 | "role": "quickLook", 184 | "subtype": "42mm", 185 | "filename": "Icon-196x196-Beta.png" 186 | }, 187 | { 188 | "size": "108x108", 189 | "idiom": "watch", 190 | "scale": "2x", 191 | "role": "quickLook", 192 | "subtype": "44mm", 193 | "filename": "Icon-216x216-Beta.png" 194 | }, 195 | { 196 | "size": "1024x1024", 197 | "idiom": "watch-marketing", 198 | "scale": "1x", 199 | "filename": "Icon-1024x1024-Beta.png" 200 | }, 201 | { 202 | "size": "16x16", 203 | "idiom": "mac", 204 | "scale": "1x", 205 | "filename": "Icon-16x16-Beta.png" 206 | }, 207 | { 208 | "size": "16x16", 209 | "idiom": "mac", 210 | "scale": "2x", 211 | "filename": "Icon-32x32-Beta.png" 212 | }, 213 | { 214 | "size": "32x32", 215 | "idiom": "mac", 216 | "scale": "1x", 217 | "filename": "Icon-32x32-Beta.png" 218 | }, 219 | { 220 | "size": "32x32", 221 | "idiom": "mac", 222 | "scale": "2x", 223 | "filename": "Icon-64x64-Beta.png" 224 | }, 225 | { 226 | "size": "128x128", 227 | "idiom": "mac", 228 | "scale": "1x", 229 | "filename": "Icon-128x128-Beta.png" 230 | }, 231 | { 232 | "size": "128x128", 233 | "idiom": "mac", 234 | "scale": "2x", 235 | "filename": "Icon-256x256-Beta.png" 236 | }, 237 | { 238 | "size": "256x256", 239 | "idiom": "mac", 240 | "scale": "1x", 241 | "filename": "Icon-256x256-Beta.png" 242 | }, 243 | { 244 | "size": "256x256", 245 | "idiom": "mac", 246 | "scale": "2x", 247 | "filename": "Icon-512x512-Beta.png" 248 | }, 249 | { 250 | "size": "512x512", 251 | "idiom": "mac", 252 | "scale": "1x", 253 | "filename": "Icon-512x512-Beta.png" 254 | }, 255 | { 256 | "size": "512x512", 257 | "idiom": "mac", 258 | "scale": "2x", 259 | "filename": "Icon-1024x1024-Beta.png" 260 | }, 261 | { 262 | "size": "60x60", 263 | "idiom": "car", 264 | "scale": "2x", 265 | "filename": "Icon-120x120-Beta.png" 266 | }, 267 | { 268 | "size": "60x60", 269 | "idiom": "car", 270 | "scale": "3x", 271 | "filename": "Icon-180x180-Beta.png" 272 | } 273 | ], 274 | "info": { 275 | "version": 1, 276 | "author": "xcode" 277 | } 278 | } -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-square-stub.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "scale": "2x", 7 | "filename": "Icon-40x40-Beta.png" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "scale": "3x", 13 | "filename": "Icon-60x60-Beta.png" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "scale": "2x", 19 | "filename": "Icon-58x58-Beta.png" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "scale": "3x", 25 | "filename": "Icon-87x87-Beta.png" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "scale": "2x", 31 | "filename": "Icon-80x80-Beta.png" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "scale": "3x", 37 | "filename": "Icon-120x120-Beta.png" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "scale": "2x", 43 | "filename": "Icon-120x120-Beta.png" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "scale": "3x", 49 | "filename": "Icon-180x180-Beta.png" 50 | }, 51 | { 52 | "size": "1024x1024", 53 | "idiom": "ios-marketing", 54 | "scale": "1x", 55 | "filename": "Icon-1024x1024-Beta.png" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "scale": "1x", 61 | "filename": "Icon-20x20-Beta.png" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "scale": "2x", 67 | "filename": "Icon-40x40-Beta.png" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "scale": "1x", 73 | "filename": "Icon-29x29-Beta.png" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "scale": "2x", 79 | "filename": "Icon-58x58-Beta.png" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "scale": "1x", 85 | "filename": "Icon-40x40-Beta.png" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "scale": "2x", 91 | "filename": "Icon-80x80-Beta.png" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "scale": "1x", 97 | "filename": "Icon-76x76-Beta.png" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "scale": "2x", 103 | "filename": "Icon-152x152-Beta.png" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "scale": "2x", 109 | "filename": "Icon-167x167-Beta.png" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "scale": "1x", 115 | "filename": "Icon-1024x1024-Beta.png" 116 | }, 117 | { 118 | "size": "24x24", 119 | "idiom": "watch", 120 | "scale": "2x", 121 | "role": "notificationCenter", 122 | "subtype": "38mm", 123 | "filename": "Icon-48x48-Beta.png" 124 | }, 125 | { 126 | "size": "27.5x27.5", 127 | "idiom": "watch", 128 | "scale": "2x", 129 | "role": "notificationCenter", 130 | "subtype": "42mm", 131 | "filename": "Icon-55x55-Beta.png" 132 | }, 133 | { 134 | "size": "29x29", 135 | "idiom": "watch", 136 | "role": "companionSettings", 137 | "scale": "2x", 138 | "filename": "Icon-58x58-Beta.png" 139 | }, 140 | { 141 | "size": "29x29", 142 | "idiom": "watch", 143 | "role": "companionSettings", 144 | "scale": "3x", 145 | "filename": "Icon-87x87-Beta.png" 146 | }, 147 | { 148 | "size": "40x40", 149 | "idiom": "watch", 150 | "scale": "2x", 151 | "role": "appLauncher", 152 | "subtype": "38mm", 153 | "filename": "Icon-80x80-Beta.png" 154 | }, 155 | { 156 | "size": "44x44", 157 | "idiom": "watch", 158 | "scale": "2x", 159 | "role": "appLauncher", 160 | "subtype": "40mm", 161 | "filename": "Icon-88x88-Beta.png" 162 | }, 163 | { 164 | "size": "50x50", 165 | "idiom": "watch", 166 | "scale": "2x", 167 | "role": "appLauncher", 168 | "subtype": "44mm", 169 | "filename": "Icon-100x100-Beta.png" 170 | }, 171 | { 172 | "size": "86x86", 173 | "idiom": "watch", 174 | "scale": "2x", 175 | "role": "quickLook", 176 | "subtype": "38mm", 177 | "filename": "Icon-172x172-Beta.png" 178 | }, 179 | { 180 | "size": "98x98", 181 | "idiom": "watch", 182 | "scale": "2x", 183 | "role": "quickLook", 184 | "subtype": "42mm", 185 | "filename": "Icon-196x196-Beta.png" 186 | }, 187 | { 188 | "size": "108x108", 189 | "idiom": "watch", 190 | "scale": "2x", 191 | "role": "quickLook", 192 | "subtype": "44mm", 193 | "filename": "Icon-216x216-Beta.png" 194 | }, 195 | { 196 | "size": "1024x1024", 197 | "idiom": "watch-marketing", 198 | "scale": "1x", 199 | "filename": "Icon-1024x1024-Beta.png" 200 | }, 201 | { 202 | "size": "16x16", 203 | "idiom": "mac", 204 | "scale": "1x", 205 | "filename": "Icon-16x16-Beta.png" 206 | }, 207 | { 208 | "size": "16x16", 209 | "idiom": "mac", 210 | "scale": "2x", 211 | "filename": "Icon-32x32-Beta.png" 212 | }, 213 | { 214 | "size": "32x32", 215 | "idiom": "mac", 216 | "scale": "1x", 217 | "filename": "Icon-32x32-Beta.png" 218 | }, 219 | { 220 | "size": "32x32", 221 | "idiom": "mac", 222 | "scale": "2x", 223 | "filename": "Icon-64x64-Beta.png" 224 | }, 225 | { 226 | "size": "128x128", 227 | "idiom": "mac", 228 | "scale": "1x", 229 | "filename": "Icon-128x128-Beta.png" 230 | }, 231 | { 232 | "size": "128x128", 233 | "idiom": "mac", 234 | "scale": "2x", 235 | "filename": "Icon-256x256-Beta.png" 236 | }, 237 | { 238 | "size": "256x256", 239 | "idiom": "mac", 240 | "scale": "1x", 241 | "filename": "Icon-256x256-Beta.png" 242 | }, 243 | { 244 | "size": "256x256", 245 | "idiom": "mac", 246 | "scale": "2x", 247 | "filename": "Icon-512x512-Beta.png" 248 | }, 249 | { 250 | "size": "512x512", 251 | "idiom": "mac", 252 | "scale": "1x", 253 | "filename": "Icon-512x512-Beta.png" 254 | }, 255 | { 256 | "size": "512x512", 257 | "idiom": "mac", 258 | "scale": "2x", 259 | "filename": "Icon-1024x1024-Beta.png" 260 | }, 261 | { 262 | "size": "60x60", 263 | "idiom": "car", 264 | "scale": "2x", 265 | "filename": "Icon-120x120-Beta.png" 266 | }, 267 | { 268 | "size": "60x60", 269 | "idiom": "car", 270 | "scale": "3x", 271 | "filename": "Icon-180x180-Beta.png" 272 | } 273 | ], 274 | "info": { 275 | "version": 1, 276 | "author": "xcode" 277 | } 278 | } -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-generated.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "scale": "2x", 7 | "filename": "Icon-40x40-Beta.png" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "scale": "3x", 13 | "filename": "Icon-60x60-Beta.png" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "scale": "2x", 19 | "filename": "Icon-58x58-Beta.png" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "scale": "3x", 25 | "filename": "Icon-87x87-Beta.png" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "scale": "2x", 31 | "filename": "Icon-80x80-Beta.png" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "scale": "3x", 37 | "filename": "Icon-120x120-Beta.png" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "scale": "2x", 43 | "filename": "Icon-120x120-Beta.png" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "scale": "3x", 49 | "filename": "Icon-180x180-Beta.png" 50 | }, 51 | { 52 | "size": "1024x1024", 53 | "idiom": "ios-marketing", 54 | "scale": "1x", 55 | "filename": "Icon-1024x1024-Beta.png" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "scale": "1x", 61 | "filename": "Icon-20x20-Beta.png" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "scale": "2x", 67 | "filename": "Icon-40x40-Beta.png" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "scale": "1x", 73 | "filename": "Icon-29x29-Beta.png" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "scale": "2x", 79 | "filename": "Icon-58x58-Beta.png" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "scale": "1x", 85 | "filename": "Icon-40x40-Beta.png" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "scale": "2x", 91 | "filename": "Icon-80x80-Beta.png" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "scale": "1x", 97 | "filename": "Icon-76x76-Beta.png" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "scale": "2x", 103 | "filename": "Icon-152x152-Beta.png" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "scale": "2x", 109 | "filename": "Icon-167x167-Beta.png" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "scale": "1x", 115 | "filename": "Icon-1024x1024-Beta.png" 116 | }, 117 | { 118 | "size": "24x24", 119 | "idiom": "watch", 120 | "scale": "2x", 121 | "role": "notificationCenter", 122 | "subtype": "38mm", 123 | "filename": "Icon-48x48-Beta.png" 124 | }, 125 | { 126 | "size": "27.5x27.5", 127 | "idiom": "watch", 128 | "scale": "2x", 129 | "role": "notificationCenter", 130 | "subtype": "42mm", 131 | "filename": "Icon-55x55-Beta.png" 132 | }, 133 | { 134 | "size": "29x29", 135 | "idiom": "watch", 136 | "role": "companionSettings", 137 | "scale": "2x", 138 | "filename": "Icon-58x58-Beta.png" 139 | }, 140 | { 141 | "size": "29x29", 142 | "idiom": "watch", 143 | "role": "companionSettings", 144 | "scale": "3x", 145 | "filename": "Icon-87x87-Beta.png" 146 | }, 147 | { 148 | "size": "40x40", 149 | "idiom": "watch", 150 | "scale": "2x", 151 | "role": "appLauncher", 152 | "subtype": "38mm", 153 | "filename": "Icon-80x80-Beta.png" 154 | }, 155 | { 156 | "size": "44x44", 157 | "idiom": "watch", 158 | "scale": "2x", 159 | "role": "appLauncher", 160 | "subtype": "40mm", 161 | "filename": "Icon-88x88-Beta.png" 162 | }, 163 | { 164 | "size": "50x50", 165 | "idiom": "watch", 166 | "scale": "2x", 167 | "role": "appLauncher", 168 | "subtype": "44mm", 169 | "filename": "Icon-100x100-Beta.png" 170 | }, 171 | { 172 | "size": "86x86", 173 | "idiom": "watch", 174 | "scale": "2x", 175 | "role": "quickLook", 176 | "subtype": "38mm", 177 | "filename": "Icon-172x172-Beta.png" 178 | }, 179 | { 180 | "size": "98x98", 181 | "idiom": "watch", 182 | "scale": "2x", 183 | "role": "quickLook", 184 | "subtype": "42mm", 185 | "filename": "Icon-196x196-Beta.png" 186 | }, 187 | { 188 | "size": "108x108", 189 | "idiom": "watch", 190 | "scale": "2x", 191 | "role": "quickLook", 192 | "subtype": "44mm", 193 | "filename": "Icon-216x216-Beta.png" 194 | }, 195 | { 196 | "size": "1024x1024", 197 | "idiom": "watch-marketing", 198 | "scale": "1x", 199 | "filename": "Icon-1024x1024-Beta.png" 200 | }, 201 | { 202 | "size": "16x16", 203 | "idiom": "mac", 204 | "scale": "1x", 205 | "filename": "Icon-16x16-Beta.png" 206 | }, 207 | { 208 | "size": "16x16", 209 | "idiom": "mac", 210 | "scale": "2x", 211 | "filename": "Icon-32x32-Beta.png" 212 | }, 213 | { 214 | "size": "32x32", 215 | "idiom": "mac", 216 | "scale": "1x", 217 | "filename": "Icon-32x32-Beta.png" 218 | }, 219 | { 220 | "size": "32x32", 221 | "idiom": "mac", 222 | "scale": "2x", 223 | "filename": "Icon-64x64-Beta.png" 224 | }, 225 | { 226 | "size": "128x128", 227 | "idiom": "mac", 228 | "scale": "1x", 229 | "filename": "Icon-128x128-Beta.png" 230 | }, 231 | { 232 | "size": "128x128", 233 | "idiom": "mac", 234 | "scale": "2x", 235 | "filename": "Icon-256x256-Beta.png" 236 | }, 237 | { 238 | "size": "256x256", 239 | "idiom": "mac", 240 | "scale": "1x", 241 | "filename": "Icon-256x256-Beta.png" 242 | }, 243 | { 244 | "size": "256x256", 245 | "idiom": "mac", 246 | "scale": "2x", 247 | "filename": "Icon-512x512-Beta.png" 248 | }, 249 | { 250 | "size": "512x512", 251 | "idiom": "mac", 252 | "scale": "1x", 253 | "filename": "Icon-512x512-Beta.png" 254 | }, 255 | { 256 | "size": "512x512", 257 | "idiom": "mac", 258 | "scale": "2x", 259 | "filename": "Icon-1024x1024-Beta.png" 260 | }, 261 | { 262 | "size": "60x60", 263 | "idiom": "car", 264 | "scale": "2x", 265 | "filename": "Icon-120x120-Beta.png" 266 | }, 267 | { 268 | "size": "60x60", 269 | "idiom": "car", 270 | "scale": "3x", 271 | "filename": "Icon-180x180-Beta.png" 272 | } 273 | ], 274 | "info": { 275 | "version": 1, 276 | "author": "xcode" 277 | } 278 | } -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-100x100-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-1024x1024-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-120x120-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-128x128-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-152x152-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-167x167-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-16x16-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-172x172-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-180x180-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-196x196-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-20x20-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-216x216-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-256x256-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-29x29-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-32x32-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-40x40-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-48x48-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-512x512-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-55x55-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-58x58-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-60x60-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-64x64-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-76x76-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-80x80-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-87x87-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/mask-triangle-stub.xcassets/AppIcon-Beta.appiconset/Icon-88x88-Beta.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "scale": "2x", 7 | "filename": "Icon-40x40.png" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "scale": "3x", 13 | "filename": "Icon-60x60.png" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "scale": "2x", 19 | "filename": "Icon-58x58.png" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "scale": "3x", 25 | "filename": "Icon-87x87.png" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "scale": "2x", 31 | "filename": "Icon-80x80.png" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "scale": "3x", 37 | "filename": "Icon-120x120.png" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "scale": "2x", 43 | "filename": "Icon-120x120.png" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "scale": "3x", 49 | "filename": "Icon-180x180.png" 50 | }, 51 | { 52 | "size": "1024x1024", 53 | "idiom": "ios-marketing", 54 | "scale": "1x", 55 | "filename": "Icon-1024x1024.png" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "scale": "1x", 61 | "filename": "Icon-20x20.png" 62 | }, 63 | { 64 | "size": "20x20", 65 | "idiom": "ipad", 66 | "scale": "2x", 67 | "filename": "Icon-40x40.png" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "scale": "1x", 73 | "filename": "Icon-29x29.png" 74 | }, 75 | { 76 | "size": "29x29", 77 | "idiom": "ipad", 78 | "scale": "2x", 79 | "filename": "Icon-58x58.png" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "scale": "1x", 85 | "filename": "Icon-40x40.png" 86 | }, 87 | { 88 | "size": "40x40", 89 | "idiom": "ipad", 90 | "scale": "2x", 91 | "filename": "Icon-80x80.png" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "scale": "1x", 97 | "filename": "Icon-76x76.png" 98 | }, 99 | { 100 | "size": "76x76", 101 | "idiom": "ipad", 102 | "scale": "2x", 103 | "filename": "Icon-152x152.png" 104 | }, 105 | { 106 | "size": "83.5x83.5", 107 | "idiom": "ipad", 108 | "scale": "2x", 109 | "filename": "Icon-167x167.png" 110 | }, 111 | { 112 | "size": "1024x1024", 113 | "idiom": "ios-marketing", 114 | "scale": "1x", 115 | "filename": "Icon-1024x1024.png" 116 | }, 117 | { 118 | "size": "24x24", 119 | "idiom": "watch", 120 | "scale": "2x", 121 | "role": "notificationCenter", 122 | "subtype": "38mm", 123 | "filename": "Icon-48x48.png" 124 | }, 125 | { 126 | "size": "27.5x27.5", 127 | "idiom": "watch", 128 | "scale": "2x", 129 | "role": "notificationCenter", 130 | "subtype": "42mm", 131 | "filename": "Icon-55x55.png" 132 | }, 133 | { 134 | "size": "29x29", 135 | "idiom": "watch", 136 | "role": "companionSettings", 137 | "scale": "2x", 138 | "filename": "Icon-58x58.png" 139 | }, 140 | { 141 | "size": "29x29", 142 | "idiom": "watch", 143 | "role": "companionSettings", 144 | "scale": "3x", 145 | "filename": "Icon-87x87.png" 146 | }, 147 | { 148 | "size": "40x40", 149 | "idiom": "watch", 150 | "scale": "2x", 151 | "role": "appLauncher", 152 | "subtype": "38mm", 153 | "filename": "Icon-80x80.png" 154 | }, 155 | { 156 | "size": "44x44", 157 | "idiom": "watch", 158 | "scale": "2x", 159 | "role": "appLauncher", 160 | "subtype": "40mm", 161 | "filename": "Icon-88x88.png" 162 | }, 163 | { 164 | "size": "50x50", 165 | "idiom": "watch", 166 | "scale": "2x", 167 | "role": "appLauncher", 168 | "subtype": "44mm", 169 | "filename": "Icon-100x100.png" 170 | }, 171 | { 172 | "size": "86x86", 173 | "idiom": "watch", 174 | "scale": "2x", 175 | "role": "quickLook", 176 | "subtype": "38mm", 177 | "filename": "Icon-172x172.png" 178 | }, 179 | { 180 | "size": "98x98", 181 | "idiom": "watch", 182 | "scale": "2x", 183 | "role": "quickLook", 184 | "subtype": "42mm", 185 | "filename": "Icon-196x196.png" 186 | }, 187 | { 188 | "size": "108x108", 189 | "idiom": "watch", 190 | "scale": "2x", 191 | "role": "quickLook", 192 | "subtype": "44mm", 193 | "filename": "Icon-216x216.png" 194 | }, 195 | { 196 | "size": "1024x1024", 197 | "idiom": "watch-marketing", 198 | "scale": "1x", 199 | "filename": "Icon-1024x1024.png" 200 | }, 201 | { 202 | "size": "16x16", 203 | "idiom": "mac", 204 | "scale": "1x", 205 | "filename": "Icon-16x16.png" 206 | }, 207 | { 208 | "size": "16x16", 209 | "idiom": "mac", 210 | "scale": "2x", 211 | "filename": "Icon-32x32.png" 212 | }, 213 | { 214 | "size": "32x32", 215 | "idiom": "mac", 216 | "scale": "1x", 217 | "filename": "Icon-32x32.png" 218 | }, 219 | { 220 | "size": "32x32", 221 | "idiom": "mac", 222 | "scale": "2x", 223 | "filename": "Icon-64x64.png" 224 | }, 225 | { 226 | "size": "128x128", 227 | "idiom": "mac", 228 | "scale": "1x", 229 | "filename": "Icon-128x128.png" 230 | }, 231 | { 232 | "size": "128x128", 233 | "idiom": "mac", 234 | "scale": "2x", 235 | "filename": "Icon-256x256.png" 236 | }, 237 | { 238 | "size": "256x256", 239 | "idiom": "mac", 240 | "scale": "1x", 241 | "filename": "Icon-256x256.png" 242 | }, 243 | { 244 | "size": "256x256", 245 | "idiom": "mac", 246 | "scale": "2x", 247 | "filename": "Icon-512x512.png" 248 | }, 249 | { 250 | "size": "512x512", 251 | "idiom": "mac", 252 | "scale": "1x", 253 | "filename": "Icon-512x512.png" 254 | }, 255 | { 256 | "size": "512x512", 257 | "idiom": "mac", 258 | "scale": "2x", 259 | "filename": "Icon-1024x1024.png" 260 | }, 261 | { 262 | "size": "60x60", 263 | "idiom": "car", 264 | "scale": "2x", 265 | "filename": "Icon-120x120.png" 266 | }, 267 | { 268 | "size": "60x60", 269 | "idiom": "car", 270 | "scale": "3x", 271 | "filename": "Icon-180x180.png" 272 | } 273 | ], 274 | "info": { 275 | "version": 1, 276 | "author": "xcode" 277 | } 278 | } -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-100x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-100x100.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-1024x1024.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-120x120.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-128x128.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-152x152.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-167x167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-167x167.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-16x16.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-172x172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-172x172.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-180x180.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-196x196.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-20x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-20x20.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-216x216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-216x216.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-256x256.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-29x29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-29x29.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-32x32.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-40x40.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-48x48.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-512x512.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-55x55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-55x55.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-58x58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-58x58.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-60x60.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-64x64.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-76x76.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-80x80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-80x80.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-87x87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-87x87.png -------------------------------------------------------------------------------- /spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-88x88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/expected/stub.xcassets/AppIcon.appiconset/Icon-88x88.png -------------------------------------------------------------------------------- /spec/resources/generate.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fueled/ios-icon-generator/a86bb3ab280377cb61e13ff030b7d65558cdbb14/spec/resources/generate.pdf -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'simplecov' 18 | require 'simplecov-console' 19 | 20 | formatters = [ 21 | SimpleCov::Formatter::Console, 22 | SimpleCov::Formatter::HTMLFormatter, 23 | ] 24 | 25 | if ENV['CI'] == 'true' 26 | require 'codecov' 27 | formatters << SimpleCov::Formatter::Codecov 28 | end 29 | 30 | SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(formatters) 31 | 32 | SimpleCov.start do 33 | add_filter %r{^/spec/} 34 | end 35 | 36 | require 'bundler/setup' 37 | require 'aruba/rspec' 38 | require 'ios_icon_generator/cli/runner' 39 | 40 | RSpec.configure do |config| 41 | config.include Aruba::Api 42 | 43 | config.example_status_persistence_file_path = '.rspec_status' 44 | 45 | config.disable_monkey_patching! 46 | 47 | config.expect_with :rspec do |config| 48 | config.syntax = :expect 49 | end 50 | 51 | config.before :each do 52 | setup_aruba 53 | end 54 | end 55 | 56 | Aruba.configure do |config| 57 | config.exit_timeout = 120.0 58 | config.io_wait_timeout = 1.0 59 | config.command_launcher = :in_process 60 | config.main_class = IOSIconGenerator::CLI::Runner 61 | end 62 | 63 | $LOAD_PATH.unshift File.expand_path('../lib', __dir__) 64 | 65 | ::Dir.glob(::File.expand_path('../support/*.rb', __FILE__)).each { |f| require_relative f } 66 | ::Dir.glob(::File.expand_path('../support/**/*.rb', __FILE__)).each { |f| require_relative f } 67 | -------------------------------------------------------------------------------- /spec/support/aruba.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Copyright (c) 2019 Fueled Digital Media, LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | require 'aruba/rspec' 18 | -------------------------------------------------------------------------------- /vendor/Contents-carplay.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "60x60", 5 | "idiom" : "car", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "size" : "60x60", 10 | "idiom" : "car", 11 | "scale" : "3x" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /vendor/Contents-imessage.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "size" : "29x29", 10 | "idiom" : "iphone", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "size" : "60x45", 15 | "idiom" : "iphone", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "size" : "60x45", 20 | "idiom" : "iphone", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "size" : "29x29", 25 | "idiom" : "ipad", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "size" : "67x50", 30 | "idiom" : "ipad", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "74x55", 35 | "idiom" : "ipad", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "size" : "1024x1024", 40 | "idiom" : "ios-marketing", 41 | "scale" : "1x" 42 | }, 43 | { 44 | "size" : "27x20", 45 | "idiom" : "universal", 46 | "scale" : "2x", 47 | "platform" : "ios" 48 | }, 49 | { 50 | "size" : "27x20", 51 | "idiom" : "universal", 52 | "scale" : "3x", 53 | "platform" : "ios" 54 | }, 55 | { 56 | "size" : "32x24", 57 | "idiom" : "universal", 58 | "scale" : "2x", 59 | "platform" : "ios" 60 | }, 61 | { 62 | "size" : "32x24", 63 | "idiom" : "universal", 64 | "scale" : "3x", 65 | "platform" : "ios" 66 | }, 67 | { 68 | "size" : "1024x768", 69 | "idiom" : "ios-marketing", 70 | "scale" : "1x", 71 | "platform" : "ios" 72 | } 73 | ], 74 | "info" : { 75 | "version" : 1, 76 | "author" : "xcode" 77 | } 78 | } -------------------------------------------------------------------------------- /vendor/Contents-ipad.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "ipad", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "size" : "20x20", 10 | "idiom" : "ipad", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "size" : "29x29", 15 | "idiom" : "ipad", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "size" : "29x29", 20 | "idiom" : "ipad", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "size" : "40x40", 25 | "idiom" : "ipad", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "size" : "40x40", 30 | "idiom" : "ipad", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "76x76", 35 | "idiom" : "ipad", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "size" : "76x76", 40 | "idiom" : "ipad", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "size" : "83.5x83.5", 45 | "idiom" : "ipad", 46 | "scale" : "2x" 47 | }, 48 | { 49 | "size" : "1024x1024", 50 | "idiom" : "ios-marketing", 51 | "scale" : "1x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /vendor/Contents-iphone.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "size" : "20x20", 10 | "idiom" : "iphone", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "size" : "29x29", 15 | "idiom" : "iphone", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "size" : "29x29", 20 | "idiom" : "iphone", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "size" : "40x40", 25 | "idiom" : "iphone", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "size" : "40x40", 30 | "idiom" : "iphone", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "size" : "60x60", 40 | "idiom" : "iphone", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "size" : "1024x1024", 45 | "idiom" : "ios-marketing", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /vendor/Contents-mac.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "size" : "16x16", 10 | "idiom" : "mac", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "size" : "32x32", 15 | "idiom" : "mac", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "size" : "32x32", 20 | "idiom" : "mac", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "size" : "128x128", 25 | "idiom" : "mac", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "size" : "128x128", 30 | "idiom" : "mac", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "256x256", 35 | "idiom" : "mac", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "size" : "256x256", 40 | "idiom" : "mac", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "size" : "512x512", 45 | "idiom" : "mac", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "size" : "512x512", 50 | "idiom" : "mac", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /vendor/Contents-watch.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "24x24", 5 | "idiom" : "watch", 6 | "scale" : "2x", 7 | "role" : "notificationCenter", 8 | "subtype" : "38mm" 9 | }, 10 | { 11 | "size" : "27.5x27.5", 12 | "idiom" : "watch", 13 | "scale" : "2x", 14 | "role" : "notificationCenter", 15 | "subtype" : "42mm" 16 | }, 17 | { 18 | "size" : "29x29", 19 | "idiom" : "watch", 20 | "role" : "companionSettings", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "size" : "29x29", 25 | "idiom" : "watch", 26 | "role" : "companionSettings", 27 | "scale" : "3x" 28 | }, 29 | { 30 | "size" : "40x40", 31 | "idiom" : "watch", 32 | "scale" : "2x", 33 | "role" : "appLauncher", 34 | "subtype" : "38mm" 35 | }, 36 | { 37 | "size" : "44x44", 38 | "idiom" : "watch", 39 | "scale" : "2x", 40 | "role" : "appLauncher", 41 | "subtype" : "40mm" 42 | }, 43 | { 44 | "size" : "50x50", 45 | "idiom" : "watch", 46 | "scale" : "2x", 47 | "role" : "appLauncher", 48 | "subtype" : "44mm" 49 | }, 50 | { 51 | "size" : "86x86", 52 | "idiom" : "watch", 53 | "scale" : "2x", 54 | "role" : "quickLook", 55 | "subtype" : "38mm" 56 | }, 57 | { 58 | "size" : "98x98", 59 | "idiom" : "watch", 60 | "scale" : "2x", 61 | "role" : "quickLook", 62 | "subtype" : "42mm" 63 | }, 64 | { 65 | "size" : "108x108", 66 | "idiom" : "watch", 67 | "scale" : "2x", 68 | "role" : "quickLook", 69 | "subtype" : "44mm" 70 | }, 71 | { 72 | "size" : "1024x1024", 73 | "idiom" : "watch-marketing", 74 | "scale" : "1x" 75 | } 76 | ], 77 | "info" : { 78 | "version" : 1, 79 | "author" : "xcode" 80 | } 81 | } -------------------------------------------------------------------------------- /vendor/README.md: -------------------------------------------------------------------------------- 1 | Vendor 2 | ============ 3 | 4 | This folder contains the generated `Contents.json` files for the given platforms, with the `filename` stripped out. This is how the type are known to be valid or not. 5 | --------------------------------------------------------------------------------