gecko-dev/gfx/qcms
Jeff Muizelaar 54a52e060a Bug 1710897 - Handle matrix inversion failing more gracefully. r=aosmond
Prior to making invert() return an Option we just gleefully
assumed that it succeeded here. Instead of panicing let's
fail to create the transform.

The problem was found by oss-fuzz:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34216

Differential Revision: https://phabricator.services.mozilla.com/D114999
2021-05-12 20:52:53 +00:00
..
fuzz Bug 1707794 - Add support for CMYK to the fuzzing target. r=aosmond 2021-04-27 14:38:51 +00:00
profiles Bug 1706144 - Add support for CMYK. r=aosmond 2021-04-23 02:42:53 +00:00
src Bug 1710897 - Handle matrix inversion failing more gracefully. r=aosmond 2021-05-12 20:52:53 +00:00
Cargo.toml Bug 1706144 - Add support for CMYK. r=aosmond 2021-04-23 02:42:53 +00:00
README.md Bug 1685311 - Flesh out the documentation a little. r=aosmond 2021-01-06 17:11:21 +00:00
build.rs Bug 1702080 - Make RUSTC_BOOTSTRAP usage conditional on 'neon' feature. r=aosmond 2021-03-31 14:31:23 +00:00
moz.build
qcms.h Bug 1706144 - Add support for CMYK. r=aosmond 2021-04-23 02:42:53 +00:00
qcmsint.h
qcmstypes.h

README.md

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.