├── .gitignore ├── Cargo.toml ├── README.md ├── src └── main.rs ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.png 3 | *.ico 4 | *.svg 5 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "icogen" 3 | version = "1.2.0" 4 | edition = "2021" 5 | authors = ["Kenton Hamaluik "] 6 | description = "Quickly convert image files into Windows .ico files" 7 | repository = "https://github.com/hamaluik/icogen" 8 | homepage = "https://github.com/hamaluik/icogen" 9 | readme = "README.md" 10 | license = "Apache-2.0" 11 | keywords = ["ico", "converter"] 12 | categories = ["command-line-utilities", "development-tools", "encoding", "multimedia::images"] 13 | 14 | [badges] 15 | maintenance = { status = "passively-maintained" } 16 | 17 | [profile.release] 18 | lto = true 19 | 20 | [dependencies] 21 | image = "0.24" 22 | console = "0.15" 23 | clap = { version = "3.2", features = ["derive", "cargo", "unicode", "wrap_help"] } 24 | anyhow = "1" 25 | rayon = "1.5" 26 | resvg = "0.23" 27 | usvg = "0.23" 28 | tiny-skia = "0.6" 29 | 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # icogen 2 | Quickly convert image files into Windows `.ico` files 3 | 4 | [![Crates.io](https://img.shields.io/crates/v/icogen.svg)](https://crates.io/crates/icogen) ![license](https://img.shields.io/crates/l/icogen) ![maintenance](https://img.shields.io/badge/maintenance-passively--maintained-yellowgreen.svg) 5 | 6 | --- 7 | 8 | I often need to convert an image into a `.ico` file and often turn to some web-based service to do this (just drag and drop the image, out comes a `.ico`, etc). I shouldn't have to go online to do this quickly and easily, hence this tool. It is small and only does 1 thing, and will only ever do one thing, by design. This is a thin CLI wrapper around the [image](https://crates.io/crates/image) crate. 9 | 10 | ## Usage 11 | 12 | ``` 13 | icogen 1.2.0 14 | Kenton Hamaluik 15 | Quickly convert image files into Windows .ico files 16 | 17 | USAGE: 18 | icogen.exe [OPTIONS] 19 | 20 | ARGS: 21 | The image file to convert 22 | 23 | OPTIONS: 24 | -f, --filter Which resampling filter to use when resizing the image [default: cubic] [possible values: nearest, triangle, cubic, gaussian, lanczos] 25 | -h, --help Print help information 26 | -o, --out The output file to write to, defaults to ".ico" 27 | -s, --sizes What sizes of icon to generate [default: 16 20 24 32 40 48 64 96 128 256] 28 | --stop-on-warning If enabled, any warnings will stop all processing 29 | -V, --version Print version information 30 | ``` 31 | 32 | ## Supported File Formats 33 | 34 | Basically what [image](https://crates.io/crates/image) supports for decoding, plus SVG: 35 | 36 | * SVG 37 | * PNG 38 | * JPEG 39 | * GIF 40 | * BMP 41 | * ICO 42 | * TIFF (baseline (no fax support) + LZW + PackBits) 43 | * WebP 44 | * AVIF (only 8-bit) 45 | * PNM (PBM, PGM, PPM, standard PAM) 46 | * DDS (DXT1, DXT3, DXT5) 47 | * TGA 48 | * OpenEXR (Rgb32F, Rgba32F (no dwa compression)) 49 | * farbfeld 50 | 51 | ## Installing 52 | 53 | From [crates.io](https://crates.io/) (assuming you have [Rust](https://www.rust-lang.org/) installed): 54 | 55 | ```bash 56 | $ cargo install icogen 57 | ``` 58 | 59 | Otherwise, some pre-compiled binaries should be available on GitHub: https://github.com/hamaluik/icogen/releases/ 60 | 61 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Kenton Hamaluik 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // //http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | use anyhow::{anyhow, Context, Result}; 16 | use clap::{Parser, ValueEnum}; 17 | use image::codecs::ico::{IcoEncoder, IcoFrame}; 18 | use image::io::Reader as ImageReader; 19 | use image::{DynamicImage, Rgba, RgbaImage}; 20 | use rayon::prelude::*; 21 | use std::ffi::OsStr; 22 | use std::path::PathBuf; 23 | use std::process::ExitCode; 24 | 25 | // re-create this type so we can derive ValueEnum on it 26 | /// Image re-sampling filter types 27 | #[derive(ValueEnum, Clone, Copy)] 28 | enum FilterType { 29 | /// Nearest-neighbour re-sampling 30 | Nearest, 31 | 32 | /// Linear (triangle) re-sampling 33 | Triangle, 34 | 35 | /// Cubic (Catmull-Rom) re-sampling 36 | Cubic, 37 | 38 | /// Gaussian re-sampling 39 | Gaussian, 40 | 41 | /// Lanczos re-sampling with window 3 42 | Lanczos, 43 | } 44 | 45 | impl Default for FilterType { 46 | fn default() -> FilterType { 47 | FilterType::Cubic 48 | } 49 | } 50 | 51 | impl From for image::imageops::FilterType { 52 | fn from(t: FilterType) -> Self { 53 | match t { 54 | FilterType::Nearest => image::imageops::FilterType::Nearest, 55 | FilterType::Triangle => image::imageops::FilterType::Triangle, 56 | FilterType::Cubic => image::imageops::FilterType::CatmullRom, 57 | FilterType::Gaussian => image::imageops::FilterType::Gaussian, 58 | FilterType::Lanczos => image::imageops::FilterType::Lanczos3, 59 | } 60 | } 61 | } 62 | 63 | #[derive(Parser)] 64 | #[clap(author, version, about)] 65 | struct Cli { 66 | /// The image file to convert 67 | image: PathBuf, 68 | 69 | #[clap(short, long, default_values_t = vec![16, 20, 24, 32, 40, 48, 64, 96, 128, 256])] 70 | /// What sizes of icon to generate 71 | sizes: Vec, 72 | 73 | #[clap(short, long, value_enum, default_value_t = FilterType::default())] 74 | /// Which re-sampling filter to use when resizing the image 75 | filter: FilterType, 76 | 77 | /// If enabled, any warnings will stop all processing 78 | #[clap(long)] 79 | stop_on_warning: bool, 80 | 81 | /// The output file to write to, defaults to ".ico" 82 | #[clap(short, long)] 83 | out: Option, 84 | } 85 | 86 | fn main() -> ExitCode { 87 | if let Err(e) = try_main() { 88 | eprintln!("{}: {e:#}", console::style("Error").red()); 89 | ExitCode::FAILURE 90 | } else { 91 | ExitCode::SUCCESS 92 | } 93 | } 94 | 95 | fn try_main() -> Result<()> { 96 | let Cli { 97 | image, 98 | mut sizes, 99 | filter, 100 | stop_on_warning, 101 | out, 102 | } = Cli::parse(); 103 | 104 | sizes.sort(); 105 | 106 | if !image.is_file() { 107 | return Err(anyhow!("Path '{}' isn't a file!", image.display())); 108 | } 109 | 110 | let output = out.unwrap_or_else(|| { 111 | let output = image.file_stem().unwrap().to_string_lossy().to_string(); 112 | PathBuf::from(format!("{output}.ico")) 113 | }); 114 | 115 | if output.exists() { 116 | eprintln!( 117 | "{}: the file '{}' already exists!", 118 | console::style("Warning").yellow(), 119 | output.display() 120 | ); 121 | if stop_on_warning { 122 | return Err(anyhow!("Program would overwrite existing icon")); 123 | } 124 | } 125 | 126 | let mut removed_sizes: Vec = Vec::default(); 127 | let sizes: Vec = sizes 128 | .into_iter() 129 | .filter(|&s| { 130 | let keep = s >= 1 && s <= 256; 131 | if !keep { 132 | removed_sizes.push(s); 133 | } 134 | keep 135 | }) 136 | .collect(); 137 | 138 | if !removed_sizes.is_empty() { 139 | eprintln!( 140 | "{}: The following sizes were removed because they are too big (or too small): {}", 141 | console::style("Warning").yellow(), 142 | removed_sizes 143 | .iter() 144 | .map(ToString::to_string) 145 | .collect::>() 146 | .join(", ") 147 | ); 148 | if stop_on_warning { 149 | return Err(anyhow!("Input image would be scaled up!")); 150 | } 151 | } 152 | 153 | if sizes.is_empty() { 154 | eprintln!( 155 | "{}: No sizes were marked for the icon, aborting!", 156 | console::style("Error").red(), 157 | ); 158 | return Ok(()); 159 | } 160 | 161 | let im: DynamicImage = if image 162 | .extension() 163 | .map(OsStr::to_str) 164 | .flatten() 165 | .map(str::to_lowercase) 166 | == Some("svg".to_owned()) 167 | { 168 | let mut opt = usvg::Options::default(); 169 | opt.resources_dir = std::fs::canonicalize(&image) 170 | .ok() 171 | .and_then(|p| p.parent().map(|p| p.to_path_buf())); 172 | opt.fontdb.load_system_fonts(); 173 | 174 | let svg = std::fs::read(&image) 175 | .with_context(|| format!("Failed to read file '{}'", image.display()))?; 176 | let rtree = usvg::Tree::from_data(&svg, &opt.to_ref()) 177 | .with_context(|| "Failed to parse SVG contents")?; 178 | 179 | let pixmap_size = rtree.svg_node().size.to_screen_size(); 180 | 181 | if pixmap_size.width() != pixmap_size.height() { 182 | eprintln!( 183 | "{}: your input image is not square, and will appear squished!", 184 | console::style("Warning").yellow() 185 | ); 186 | if stop_on_warning { 187 | return Err(anyhow!("Input image isn't square!")); 188 | } 189 | } 190 | 191 | let mut pixmap = tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()) 192 | .with_context(|| "Failed to create SVG Pixmap!")?; 193 | 194 | let size = *sizes.iter().max().unwrap(); 195 | resvg::render( 196 | &rtree, 197 | usvg::FitTo::Size(size, size), 198 | tiny_skia::Transform::default(), 199 | pixmap.as_mut(), 200 | ) 201 | .with_context(|| "Failed to render SVG!")?; 202 | 203 | // copy it into an image buffer translating types as we go 204 | // I'm sure there's faster ways of doing this but ¯\_(ツ)_/¯ 205 | let mut image = RgbaImage::new(size, size); 206 | for y in 0..size { 207 | for x in 0..size { 208 | let pixel = pixmap.pixel(x, y).unwrap(); 209 | let pixel = Rgba([pixel.red(), pixel.green(), pixel.blue(), pixel.alpha()]); 210 | image.put_pixel(x, y, pixel); 211 | } 212 | } 213 | 214 | image.into() 215 | } else { 216 | ImageReader::open(&image) 217 | .with_context(|| format!("Failed to open file '{}'", image.display()))? 218 | .decode() 219 | .with_context(|| "Failed to decode image!")? 220 | }; 221 | 222 | if im.width() != im.height() { 223 | eprintln!( 224 | "{}: your input image is not square, and will appear squished!", 225 | console::style("Warning").yellow() 226 | ); 227 | if stop_on_warning { 228 | return Err(anyhow!("Input image isn't square!")); 229 | } 230 | } 231 | 232 | if im.width() < sizes.iter().max().map(|&v| v).unwrap_or_default() { 233 | eprintln!( 234 | "{}: You've requested sizes bigger than your input, your image will be scaled up!", 235 | console::style("Warning").yellow() 236 | ); 237 | if stop_on_warning { 238 | return Err(anyhow!("Input image would be scaled up!")); 239 | } 240 | } 241 | 242 | println!( 243 | "Converting {} to {} with sizes [{}]...", 244 | image.display(), 245 | output.display(), 246 | sizes 247 | .iter() 248 | .map(ToString::to_string) 249 | .collect::>() 250 | .join(", ") 251 | ); 252 | 253 | let frames: Vec> = sizes 254 | .par_iter() 255 | .map(|&sz| { 256 | let im = im.resize_exact(sz, sz, filter.into()); 257 | im.to_rgba8().to_vec() 258 | }) 259 | .collect(); 260 | 261 | let frames: Result> = frames 262 | .par_iter() 263 | .zip(sizes.par_iter()) 264 | .map(|(buf, &sz)| { 265 | IcoFrame::as_png(buf.as_slice(), sz, sz, im.color()) 266 | .with_context(|| "Failed to encode frame") 267 | }) 268 | .collect(); 269 | let frames = frames?; 270 | 271 | let file = std::fs::File::create(&output) 272 | .with_context(|| format!("Failed to create file '{}'", output.display()))?; 273 | let encoder = IcoEncoder::new(file); 274 | encoder 275 | .encode_images(frames.as_slice()) 276 | .with_context(|| "Failed to encode .ico file")?; 277 | 278 | println!("Icon saved to '{}'!", output.display()); 279 | Ok(()) 280 | } 281 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | 204 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "adler32" 13 | version = "1.2.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" 16 | 17 | [[package]] 18 | name = "anyhow" 19 | version = "1.0.59" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "c91f1f46651137be86f3a2b9a8359f9ab421d04d941c62b5982e1ca21113adf9" 22 | 23 | [[package]] 24 | name = "arrayref" 25 | version = "0.3.6" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 28 | 29 | [[package]] 30 | name = "arrayvec" 31 | version = "0.5.2" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 34 | 35 | [[package]] 36 | name = "arrayvec" 37 | version = "0.7.2" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 40 | 41 | [[package]] 42 | name = "atty" 43 | version = "0.2.14" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 46 | dependencies = [ 47 | "hermit-abi", 48 | "libc", 49 | "winapi", 50 | ] 51 | 52 | [[package]] 53 | name = "autocfg" 54 | version = "1.1.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 57 | 58 | [[package]] 59 | name = "base64" 60 | version = "0.13.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 63 | 64 | [[package]] 65 | name = "bit_field" 66 | version = "0.10.1" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" 69 | 70 | [[package]] 71 | name = "bitflags" 72 | version = "1.3.2" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 75 | 76 | [[package]] 77 | name = "bumpalo" 78 | version = "3.10.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" 81 | 82 | [[package]] 83 | name = "bytemuck" 84 | version = "1.11.0" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "a5377c8865e74a160d21f29c2d40669f53286db6eab59b88540cbb12ffc8b835" 87 | 88 | [[package]] 89 | name = "byteorder" 90 | version = "1.4.3" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 93 | 94 | [[package]] 95 | name = "cfg-if" 96 | version = "1.0.0" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 99 | 100 | [[package]] 101 | name = "clap" 102 | version = "3.2.16" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "a3dbbb6653e7c55cc8595ad3e1f7be8f32aba4eb7ff7f0fd1163d4f3d137c0a9" 105 | dependencies = [ 106 | "atty", 107 | "bitflags", 108 | "clap_derive", 109 | "clap_lex", 110 | "indexmap", 111 | "once_cell", 112 | "strsim", 113 | "termcolor", 114 | "terminal_size", 115 | "textwrap", 116 | "unicase", 117 | ] 118 | 119 | [[package]] 120 | name = "clap_derive" 121 | version = "3.2.15" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "9ba52acd3b0a5c33aeada5cdaa3267cdc7c594a98731d4268cdc1532f4264cb4" 124 | dependencies = [ 125 | "heck", 126 | "proc-macro-error", 127 | "proc-macro2", 128 | "quote", 129 | "syn", 130 | ] 131 | 132 | [[package]] 133 | name = "clap_lex" 134 | version = "0.2.4" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 137 | dependencies = [ 138 | "os_str_bytes", 139 | ] 140 | 141 | [[package]] 142 | name = "color_quant" 143 | version = "1.1.0" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 146 | 147 | [[package]] 148 | name = "console" 149 | version = "0.15.1" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "89eab4d20ce20cea182308bca13088fecea9c05f6776cf287205d41a0ed3c847" 152 | dependencies = [ 153 | "encode_unicode", 154 | "libc", 155 | "once_cell", 156 | "terminal_size", 157 | "unicode-width", 158 | "winapi", 159 | ] 160 | 161 | [[package]] 162 | name = "crc32fast" 163 | version = "1.3.2" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 166 | dependencies = [ 167 | "cfg-if", 168 | ] 169 | 170 | [[package]] 171 | name = "crossbeam-channel" 172 | version = "0.5.6" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 175 | dependencies = [ 176 | "cfg-if", 177 | "crossbeam-utils", 178 | ] 179 | 180 | [[package]] 181 | name = "crossbeam-deque" 182 | version = "0.8.2" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 185 | dependencies = [ 186 | "cfg-if", 187 | "crossbeam-epoch", 188 | "crossbeam-utils", 189 | ] 190 | 191 | [[package]] 192 | name = "crossbeam-epoch" 193 | version = "0.9.10" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" 196 | dependencies = [ 197 | "autocfg", 198 | "cfg-if", 199 | "crossbeam-utils", 200 | "memoffset", 201 | "once_cell", 202 | "scopeguard", 203 | ] 204 | 205 | [[package]] 206 | name = "crossbeam-utils" 207 | version = "0.8.11" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" 210 | dependencies = [ 211 | "cfg-if", 212 | "once_cell", 213 | ] 214 | 215 | [[package]] 216 | name = "data-url" 217 | version = "0.1.1" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" 220 | dependencies = [ 221 | "matches", 222 | ] 223 | 224 | [[package]] 225 | name = "deflate" 226 | version = "1.0.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" 229 | dependencies = [ 230 | "adler32", 231 | ] 232 | 233 | [[package]] 234 | name = "either" 235 | version = "1.7.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" 238 | 239 | [[package]] 240 | name = "encode_unicode" 241 | version = "0.3.6" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 244 | 245 | [[package]] 246 | name = "exr" 247 | version = "1.4.2" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "14cc0e06fb5f67e5d6beadf3a382fec9baca1aa751c6d5368fdeee7e5932c215" 250 | dependencies = [ 251 | "bit_field", 252 | "deflate", 253 | "flume", 254 | "half", 255 | "inflate", 256 | "lebe", 257 | "smallvec", 258 | "threadpool", 259 | ] 260 | 261 | [[package]] 262 | name = "flate2" 263 | version = "1.0.24" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 266 | dependencies = [ 267 | "crc32fast", 268 | "miniz_oxide", 269 | ] 270 | 271 | [[package]] 272 | name = "float-cmp" 273 | version = "0.9.0" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 276 | 277 | [[package]] 278 | name = "flume" 279 | version = "0.10.14" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" 282 | dependencies = [ 283 | "futures-core", 284 | "futures-sink", 285 | "nanorand", 286 | "pin-project", 287 | "spin", 288 | ] 289 | 290 | [[package]] 291 | name = "fontconfig-parser" 292 | version = "0.5.0" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "82cea2adebf32a9b104b8ffb308b5fb3b456f04cc76c294c3c85025c8a5d75f4" 295 | dependencies = [ 296 | "roxmltree", 297 | ] 298 | 299 | [[package]] 300 | name = "fontdb" 301 | version = "0.9.1" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "122fa73a5566372f9df09768a16e8e3dad7ad18abe07835f1f0b71f84078ba4c" 304 | dependencies = [ 305 | "fontconfig-parser", 306 | "log", 307 | "memmap2", 308 | "ttf-parser", 309 | ] 310 | 311 | [[package]] 312 | name = "futures-core" 313 | version = "0.3.21" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 316 | 317 | [[package]] 318 | name = "futures-sink" 319 | version = "0.3.21" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 322 | 323 | [[package]] 324 | name = "getrandom" 325 | version = "0.2.7" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 328 | dependencies = [ 329 | "cfg-if", 330 | "js-sys", 331 | "libc", 332 | "wasi", 333 | "wasm-bindgen", 334 | ] 335 | 336 | [[package]] 337 | name = "gif" 338 | version = "0.11.4" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" 341 | dependencies = [ 342 | "color_quant", 343 | "weezl", 344 | ] 345 | 346 | [[package]] 347 | name = "half" 348 | version = "1.8.2" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" 351 | 352 | [[package]] 353 | name = "hashbrown" 354 | version = "0.12.3" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 357 | 358 | [[package]] 359 | name = "heck" 360 | version = "0.4.0" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 363 | 364 | [[package]] 365 | name = "hermit-abi" 366 | version = "0.1.19" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 369 | dependencies = [ 370 | "libc", 371 | ] 372 | 373 | [[package]] 374 | name = "icogen" 375 | version = "1.2.0" 376 | dependencies = [ 377 | "anyhow", 378 | "clap", 379 | "console", 380 | "image", 381 | "rayon", 382 | "resvg", 383 | "tiny-skia", 384 | "usvg", 385 | ] 386 | 387 | [[package]] 388 | name = "image" 389 | version = "0.24.3" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964" 392 | dependencies = [ 393 | "bytemuck", 394 | "byteorder", 395 | "color_quant", 396 | "exr", 397 | "gif", 398 | "jpeg-decoder", 399 | "num-rational", 400 | "num-traits", 401 | "png", 402 | "scoped_threadpool", 403 | "tiff", 404 | ] 405 | 406 | [[package]] 407 | name = "indexmap" 408 | version = "1.9.1" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 411 | dependencies = [ 412 | "autocfg", 413 | "hashbrown", 414 | ] 415 | 416 | [[package]] 417 | name = "inflate" 418 | version = "0.4.5" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" 421 | dependencies = [ 422 | "adler32", 423 | ] 424 | 425 | [[package]] 426 | name = "jpeg-decoder" 427 | version = "0.2.6" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b" 430 | dependencies = [ 431 | "rayon", 432 | ] 433 | 434 | [[package]] 435 | name = "js-sys" 436 | version = "0.3.59" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" 439 | dependencies = [ 440 | "wasm-bindgen", 441 | ] 442 | 443 | [[package]] 444 | name = "kurbo" 445 | version = "0.8.3" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449" 448 | dependencies = [ 449 | "arrayvec 0.7.2", 450 | ] 451 | 452 | [[package]] 453 | name = "lebe" 454 | version = "0.5.1" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff" 457 | 458 | [[package]] 459 | name = "libc" 460 | version = "0.2.127" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "505e71a4706fa491e9b1b55f51b95d4037d0821ee40131190475f692b35b009b" 463 | 464 | [[package]] 465 | name = "lock_api" 466 | version = "0.4.7" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 469 | dependencies = [ 470 | "autocfg", 471 | "scopeguard", 472 | ] 473 | 474 | [[package]] 475 | name = "log" 476 | version = "0.4.17" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 479 | dependencies = [ 480 | "cfg-if", 481 | ] 482 | 483 | [[package]] 484 | name = "matches" 485 | version = "0.1.9" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 488 | 489 | [[package]] 490 | name = "memmap2" 491 | version = "0.5.5" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "3a79b39c93a7a5a27eeaf9a23b5ff43f1b9e0ad6b1cdd441140ae53c35613fc7" 494 | dependencies = [ 495 | "libc", 496 | ] 497 | 498 | [[package]] 499 | name = "memoffset" 500 | version = "0.6.5" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 503 | dependencies = [ 504 | "autocfg", 505 | ] 506 | 507 | [[package]] 508 | name = "miniz_oxide" 509 | version = "0.5.3" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" 512 | dependencies = [ 513 | "adler", 514 | ] 515 | 516 | [[package]] 517 | name = "nanorand" 518 | version = "0.7.0" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" 521 | dependencies = [ 522 | "getrandom", 523 | ] 524 | 525 | [[package]] 526 | name = "num-integer" 527 | version = "0.1.45" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 530 | dependencies = [ 531 | "autocfg", 532 | "num-traits", 533 | ] 534 | 535 | [[package]] 536 | name = "num-rational" 537 | version = "0.4.1" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" 540 | dependencies = [ 541 | "autocfg", 542 | "num-integer", 543 | "num-traits", 544 | ] 545 | 546 | [[package]] 547 | name = "num-traits" 548 | version = "0.2.15" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 551 | dependencies = [ 552 | "autocfg", 553 | ] 554 | 555 | [[package]] 556 | name = "num_cpus" 557 | version = "1.13.1" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 560 | dependencies = [ 561 | "hermit-abi", 562 | "libc", 563 | ] 564 | 565 | [[package]] 566 | name = "once_cell" 567 | version = "1.13.0" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 570 | 571 | [[package]] 572 | name = "os_str_bytes" 573 | version = "6.2.0" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "648001efe5d5c0102d8cea768e348da85d90af8ba91f0bea908f157951493cd4" 576 | 577 | [[package]] 578 | name = "pico-args" 579 | version = "0.5.0" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 582 | 583 | [[package]] 584 | name = "pin-project" 585 | version = "1.0.11" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" 588 | dependencies = [ 589 | "pin-project-internal", 590 | ] 591 | 592 | [[package]] 593 | name = "pin-project-internal" 594 | version = "1.0.11" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" 597 | dependencies = [ 598 | "proc-macro2", 599 | "quote", 600 | "syn", 601 | ] 602 | 603 | [[package]] 604 | name = "png" 605 | version = "0.17.5" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" 608 | dependencies = [ 609 | "bitflags", 610 | "crc32fast", 611 | "deflate", 612 | "miniz_oxide", 613 | ] 614 | 615 | [[package]] 616 | name = "proc-macro-error" 617 | version = "1.0.4" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 620 | dependencies = [ 621 | "proc-macro-error-attr", 622 | "proc-macro2", 623 | "quote", 624 | "syn", 625 | "version_check", 626 | ] 627 | 628 | [[package]] 629 | name = "proc-macro-error-attr" 630 | version = "1.0.4" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 633 | dependencies = [ 634 | "proc-macro2", 635 | "quote", 636 | "version_check", 637 | ] 638 | 639 | [[package]] 640 | name = "proc-macro2" 641 | version = "1.0.43" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 644 | dependencies = [ 645 | "unicode-ident", 646 | ] 647 | 648 | [[package]] 649 | name = "quote" 650 | version = "1.0.21" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 653 | dependencies = [ 654 | "proc-macro2", 655 | ] 656 | 657 | [[package]] 658 | name = "rayon" 659 | version = "1.5.3" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" 662 | dependencies = [ 663 | "autocfg", 664 | "crossbeam-deque", 665 | "either", 666 | "rayon-core", 667 | ] 668 | 669 | [[package]] 670 | name = "rayon-core" 671 | version = "1.9.3" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" 674 | dependencies = [ 675 | "crossbeam-channel", 676 | "crossbeam-deque", 677 | "crossbeam-utils", 678 | "num_cpus", 679 | ] 680 | 681 | [[package]] 682 | name = "rctree" 683 | version = "0.4.0" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "9ae028b272a6e99d9f8260ceefa3caa09300a8d6c8d2b2001316474bc52122e9" 686 | 687 | [[package]] 688 | name = "resvg" 689 | version = "0.23.0" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | checksum = "34489194784b86c03c3d688258e2ba73f3c82700ba4673ee2ecad5ae540b9438" 692 | dependencies = [ 693 | "gif", 694 | "jpeg-decoder", 695 | "log", 696 | "pico-args", 697 | "png", 698 | "rgb", 699 | "svgfilters", 700 | "svgtypes", 701 | "tiny-skia", 702 | "usvg", 703 | ] 704 | 705 | [[package]] 706 | name = "rgb" 707 | version = "0.8.33" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "c3b221de559e4a29df3b957eec92bc0de6bc8eaf6ca9cfed43e5e1d67ff65a34" 710 | dependencies = [ 711 | "bytemuck", 712 | ] 713 | 714 | [[package]] 715 | name = "roxmltree" 716 | version = "0.14.1" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" 719 | dependencies = [ 720 | "xmlparser", 721 | ] 722 | 723 | [[package]] 724 | name = "rustybuzz" 725 | version = "0.5.1" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "a617c811f5c9a7060fe511d35d13bf5b9f0463ce36d63ce666d05779df2b4eba" 728 | dependencies = [ 729 | "bitflags", 730 | "bytemuck", 731 | "smallvec", 732 | "ttf-parser", 733 | "unicode-bidi-mirroring", 734 | "unicode-ccc", 735 | "unicode-general-category", 736 | "unicode-script", 737 | ] 738 | 739 | [[package]] 740 | name = "safe_arch" 741 | version = "0.5.2" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" 744 | dependencies = [ 745 | "bytemuck", 746 | ] 747 | 748 | [[package]] 749 | name = "scoped_threadpool" 750 | version = "0.1.9" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" 753 | 754 | [[package]] 755 | name = "scopeguard" 756 | version = "1.1.0" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 759 | 760 | [[package]] 761 | name = "simplecss" 762 | version = "0.2.1" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" 765 | dependencies = [ 766 | "log", 767 | ] 768 | 769 | [[package]] 770 | name = "siphasher" 771 | version = "0.3.10" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 774 | 775 | [[package]] 776 | name = "smallvec" 777 | version = "1.9.0" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 780 | 781 | [[package]] 782 | name = "spin" 783 | version = "0.9.4" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" 786 | dependencies = [ 787 | "lock_api", 788 | ] 789 | 790 | [[package]] 791 | name = "strsim" 792 | version = "0.10.0" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 795 | 796 | [[package]] 797 | name = "svgfilters" 798 | version = "0.4.0" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "639abcebc15fdc2df179f37d6f5463d660c1c79cd552c12343a4600827a04bce" 801 | dependencies = [ 802 | "float-cmp", 803 | "rgb", 804 | ] 805 | 806 | [[package]] 807 | name = "svgtypes" 808 | version = "0.8.1" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "cc802f68b144cdf4d8ff21301f9a7863e837c627fde46537e29c05e8a18c85c1" 811 | dependencies = [ 812 | "siphasher", 813 | ] 814 | 815 | [[package]] 816 | name = "syn" 817 | version = "1.0.99" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 820 | dependencies = [ 821 | "proc-macro2", 822 | "quote", 823 | "unicode-ident", 824 | ] 825 | 826 | [[package]] 827 | name = "termcolor" 828 | version = "1.1.3" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 831 | dependencies = [ 832 | "winapi-util", 833 | ] 834 | 835 | [[package]] 836 | name = "terminal_size" 837 | version = "0.1.17" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 840 | dependencies = [ 841 | "libc", 842 | "winapi", 843 | ] 844 | 845 | [[package]] 846 | name = "textwrap" 847 | version = "0.15.0" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" 850 | dependencies = [ 851 | "terminal_size", 852 | "unicode-width", 853 | ] 854 | 855 | [[package]] 856 | name = "threadpool" 857 | version = "1.8.1" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" 860 | dependencies = [ 861 | "num_cpus", 862 | ] 863 | 864 | [[package]] 865 | name = "tiff" 866 | version = "0.7.3" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "7259662e32d1e219321eb309d5f9d898b779769d81b76e762c07c8e5d38fcb65" 869 | dependencies = [ 870 | "flate2", 871 | "jpeg-decoder", 872 | "weezl", 873 | ] 874 | 875 | [[package]] 876 | name = "tiny-skia" 877 | version = "0.6.6" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "d049bfef0eaa2521e75d9ffb5ce86ad54480932ae19b85f78bec6f52c4d30d78" 880 | dependencies = [ 881 | "arrayref", 882 | "arrayvec 0.5.2", 883 | "bytemuck", 884 | "cfg-if", 885 | "png", 886 | "safe_arch", 887 | ] 888 | 889 | [[package]] 890 | name = "ttf-parser" 891 | version = "0.15.2" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" 894 | 895 | [[package]] 896 | name = "unicase" 897 | version = "2.6.0" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 900 | dependencies = [ 901 | "version_check", 902 | ] 903 | 904 | [[package]] 905 | name = "unicode-bidi" 906 | version = "0.3.8" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 909 | 910 | [[package]] 911 | name = "unicode-bidi-mirroring" 912 | version = "0.1.0" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" 915 | 916 | [[package]] 917 | name = "unicode-ccc" 918 | version = "0.1.2" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" 921 | 922 | [[package]] 923 | name = "unicode-general-category" 924 | version = "0.4.0" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "07547e3ee45e28326cc23faac56d44f58f16ab23e413db526debce3b0bfd2742" 927 | 928 | [[package]] 929 | name = "unicode-ident" 930 | version = "1.0.3" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 933 | 934 | [[package]] 935 | name = "unicode-script" 936 | version = "0.5.4" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "58dd944fd05f2f0b5c674917aea8a4df6af84f2d8de3fe8d988b95d28fb8fb09" 939 | 940 | [[package]] 941 | name = "unicode-vo" 942 | version = "0.1.0" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" 945 | 946 | [[package]] 947 | name = "unicode-width" 948 | version = "0.1.9" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 951 | 952 | [[package]] 953 | name = "usvg" 954 | version = "0.23.0" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "28a82565b5c96dcbb58c9bdbb6aa3642abd395a6a6b480658532c6f74c3c4b7a" 957 | dependencies = [ 958 | "base64", 959 | "data-url", 960 | "flate2", 961 | "float-cmp", 962 | "fontdb", 963 | "kurbo", 964 | "log", 965 | "pico-args", 966 | "rctree", 967 | "roxmltree", 968 | "rustybuzz", 969 | "simplecss", 970 | "siphasher", 971 | "svgtypes", 972 | "ttf-parser", 973 | "unicode-bidi", 974 | "unicode-script", 975 | "unicode-vo", 976 | "xmlwriter", 977 | ] 978 | 979 | [[package]] 980 | name = "version_check" 981 | version = "0.9.4" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 984 | 985 | [[package]] 986 | name = "wasi" 987 | version = "0.11.0+wasi-snapshot-preview1" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 990 | 991 | [[package]] 992 | name = "wasm-bindgen" 993 | version = "0.2.82" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" 996 | dependencies = [ 997 | "cfg-if", 998 | "wasm-bindgen-macro", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "wasm-bindgen-backend" 1003 | version = "0.2.82" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" 1006 | dependencies = [ 1007 | "bumpalo", 1008 | "log", 1009 | "once_cell", 1010 | "proc-macro2", 1011 | "quote", 1012 | "syn", 1013 | "wasm-bindgen-shared", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "wasm-bindgen-macro" 1018 | version = "0.2.82" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" 1021 | dependencies = [ 1022 | "quote", 1023 | "wasm-bindgen-macro-support", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "wasm-bindgen-macro-support" 1028 | version = "0.2.82" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" 1031 | dependencies = [ 1032 | "proc-macro2", 1033 | "quote", 1034 | "syn", 1035 | "wasm-bindgen-backend", 1036 | "wasm-bindgen-shared", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "wasm-bindgen-shared" 1041 | version = "0.2.82" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" 1044 | 1045 | [[package]] 1046 | name = "weezl" 1047 | version = "0.1.7" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" 1050 | 1051 | [[package]] 1052 | name = "winapi" 1053 | version = "0.3.9" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1056 | dependencies = [ 1057 | "winapi-i686-pc-windows-gnu", 1058 | "winapi-x86_64-pc-windows-gnu", 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "winapi-i686-pc-windows-gnu" 1063 | version = "0.4.0" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1066 | 1067 | [[package]] 1068 | name = "winapi-util" 1069 | version = "0.1.5" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1072 | dependencies = [ 1073 | "winapi", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "winapi-x86_64-pc-windows-gnu" 1078 | version = "0.4.0" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1081 | 1082 | [[package]] 1083 | name = "xmlparser" 1084 | version = "0.13.3" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" 1087 | 1088 | [[package]] 1089 | name = "xmlwriter" 1090 | version = "0.1.0" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" 1093 | --------------------------------------------------------------------------------