IconBaker

Crate API Minimum rustc version Downloads License

A simple solution for encoding common icon file-formats, such as .ico and .icns.

This crate is mostly a wrapper for other libraries, unifying existing APIs into a single, cohesive interface. It serves as IconPie's internal library.

Overview

An icon consists of a map between entries and images. An entry is simply the key type of an icon.

For example, icon formats that only differenciate images by their dimensions, such as the .ico and .icns file formats, are maps between positive integers and image buffers. On the other hand, more complex icon formats, such as favicons and FreeDesktop icon themes , are maps file paths and positive integers to image buffers.

Note that every entry must be convertible to a posit integers, since the dimensions of the images contained in an icon are dictated by their associated entries. Therefore, all entry types are required to implement AsRef<u32>.

IconBaker simply automates the process of re-scaling pictures and combining them into an icon.

Pictures are scaled using resampling filters, which are represented by functions that take a source image and a size and return a re-scaled image.

This allows the users of this crate to provide their custom resampling filters. Common resampling filters are provided in the resample module.

Examples

General Usage

```rust use iconbaker::{Ico, SourceImage, Icon}; use iconbaker::Error as IconError;

fn example() -> Result<(), IconError> { let icon = Ico::new();

match SourceImage::from_path("image.svg") {
    Some(img) => icon.add_entry(resample::linear, &img, 32),
    None      => Ok(())
}

} ```

Writing to a File

```rust use icon_baker::*; use std::{io, fs::File};

fn example() -> io::Result<()> { let icon = PngSequence::new();

/* Process the icon */

let file = File::create("out.icns")?;
icon.write(file)

} ```

Support

Icon Formats

This are the output formats IconBaker nativally supports. Be aware that custum output types can be created using the Icon trait.

Icns Support

Icon Baker uses the icns crate for generating .icns files. The supported icon types are specified by the creators of such crate as follows:

| OSType | Description | Supported? | |--------|----------------------------------------------|--------------| | ICON | 32×32 1-bit entry | No | | ICN# | 32×32 1-bit entry with 1-bit mask | No | | icm# | 16×12 1-bit entry with 1-bit mask | No | | icm4 | 16×12 4-bit entry | No | | icm8 | 16×12 8-bit entry | No | | ics# | 16×16 1-bit mask | No | | ics4 | 16×16 4-bit entry | No | | ics8 | 16x16 8-bit entry | No | | is32 | 16×16 24-bit entry | Yes | | s8mk | 16x16 8-bit mask | Yes | | icl4 | 32×32 4-bit entry | No | | icl8 | 32×32 8-bit entry | No | | il32 | 32x32 24-bit entry | Yes | | l8mk | 32×32 8-bit mask | Yes | | ich# | 48×48 1-bit mask | No | | ich4 | 48×48 4-bit entry | No | | ich8 | 48×48 8-bit entry | No | | ih32 | 48×48 24-bit entry | Yes | | h8mk | 48×48 8-bit mask | Yes | | it32 | 128×128 24-bit entry | Yes | | t8mk | 128×128 8-bit mask | Yes | | icp4 | 16x16 32-bit png/jp2 entry | png only | | icp5 | 32x32 32-bit png/jp2 entry | png only | | icp6 | 64x64 32-bit png/jp2 entry | png only | | ic07 | 128x128 32-bit png/jp2 entry | png only | | ic08 | 256×256 32-bit png/jp2 entry | png only | | ic09 | 512×512 32-bit png/jp2 entry | png only | | ic10 | 512x512@2x "retina" 32-bit png/jp2 entry | png only | | ic11 | 16x16@2x "retina" 32-bit png/jp2 entry | png only | | ic12 | 32x32@2x "retina" 32-bit png/jp2 entry | png only | | ic13 | 128x128@2x "retina" 32-bit png/jp2 entry | png only | | ic14 | 256x256@2x "retina" 32-bit png/jp2 entry | png only |

Image Formats

IconBaker uses image for raster graphics manipulations and resvg with the raqote backend for svg rasterization. Note that raqote requires cmake to build.

| Format | Supported? | |--------|------------------------------------------------------------------------| | png | All supported color types | | jpeg | Baseline and progressive | | gif | Yes | | bmp | Yes | | ico | Yes | | tiff | Baseline(no fax support), lzw, PackBits | | webp | Lossy(Luma channel only) | | pnm | pbm, pgm, ppm, standard pma | | svg | Static SVG Full 1.1 |

License

Licensed under MIT license(LICENSE-MIT or http://opensource.org/licenses/MIT).

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be licensed as above, without any additional terms or conditions.