gecko-dev/gfx/qcms
Jeff Muizelaar 2091af5f6b Bug 1795045 - qcms: Add support for only reading the curves from profiles. r=aosmond
We use this when reading the output profiles to avoid the
performance cost of doing the color transformation using LUTs
when the output profile has them.

This will let us enable ICCv4 everywhere.

Differential Revision: https://phabricator.services.mozilla.com/D159273
2022-10-14 19:16:54 +00:00
..
fuzz
profiles
src Bug 1795045 - qcms: Add support for only reading the curves from profiles. r=aosmond 2022-10-14 19:16:54 +00:00
Cargo.toml Bug 1783985 - Remove compat with rustc < 1.61 from qcms. r=gfx-reviewers,jgilbert,jrmuizel 2022-08-16 00:56:24 +00:00
ITU-709.icc
ITU-2020.icc
moz.build
qcms.h Bug 1795045 - qcms: Add support for only reading the curves from profiles. r=aosmond 2022-10-14 19:16:54 +00:00
qcmsint.h
qcmstypes.h
README.md
sRGB_lcms.icc

qcms

Crates.io Documentation

Firefox's library for transforming image data between ICC profiles.

Example

    // Decode the jpeg
    let mut d = jpeg_decoder::Decoder::new(std::fs::File::open("/Users/jrmuizel/Desktop/DSCF2460.jpg").unwrap());
    let mut data = d.decode().unwrap();
    let info = d.info().unwrap();

    // Extract the profile after decode
    let profile = d.icc_profile().unwrap();

    // Create a new qcms Profile
    let input = qcms::Profile::new_from_slice(&profile).unwrap();
    let mut output = qcms::Profile::new_sRGB();
    output.precache_output_transform();

    // Create a transform between input and output profiles and apply it.
    let xfm = qcms::Transform::new(&input, &output, qcms::DataType::RGB8, qcms::Intent::default()).unwrap();
    xfm.apply(&mut data);

    // write the result to a PNG
    let mut encoder = png::Encoder::new(std::fs::File::create("out.png").unwrap(), info.width as u32, info.height as u32);
    encoder.set_color(png::ColorType::Rgb);
    encoder.set_srgb(png::SrgbRenderingIntent::Perceptual);
    let mut writer = encoder.write_header().unwrap();
    writer.write_image_data(&data).unwrap(); // Save

This library was originally written in C, was converted to Rust using c2rust, and then refactored to be mostly safe and more idiomatic Rust.