ironpress 1.4.4

Pure Rust HTML/CSS/Markdown to PDF converter with layout engine, LaTeX math, tables, images, custom fonts, and streaming output. No browser, no system dependencies.
Documentation
use super::*;
use crate::style::computed::ColorSource;
use crate::types::{Color, CornerRadii, CornerRadius};

fn rounded_box_pixels(radii: CornerRadii) -> Vec<u8> {
    let mut pixmap = resvg::tiny_skia::Pixmap::new(8, 8).expect("test raster dimensions");
    let mut path = resvg::tiny_skia::PathBuilder::new();
    append_rounded_box_path(&mut path, 1.0, 1.0, 6.0, 6.0, radii);
    let path = path.finish().expect("test rounded path");
    let mut paint = resvg::tiny_skia::Paint::default();
    paint.set_color_rgba8(0, 0, 0, 255);
    paint.anti_alias = true;
    pixmap.fill_path(
        &path,
        &paint,
        resvg::tiny_skia::FillRule::Winding,
        resvg::tiny_skia::Transform::identity(),
        None,
    );
    pixmap.data().to_vec()
}

#[test]
fn positive_subpixel_corner_radius_is_not_squared_off() {
    assert_ne!(
        rounded_box_pixels(CornerRadii::circular(0.49)),
        rounded_box_pixels(CornerRadii::ZERO)
    );
}

#[test]
fn zero_radius_axis_makes_the_corner_square() {
    assert_eq!(
        rounded_box_pixels(CornerRadii::uniform(CornerRadius::new(2.0, 0.0))),
        rounded_box_pixels(CornerRadii::ZERO)
    );
}

#[test]
fn rounded_box_path_preserves_per_corner_ellipses() {
    let radii = CornerRadii::new(
        CornerRadius::new(1.0, 2.0),
        CornerRadius::new(2.0, 1.0),
        CornerRadius::new(3.0, 1.0),
        CornerRadius::new(1.0, 3.0),
    );
    assert_ne!(
        rounded_box_pixels(radii),
        rounded_box_pixels(CornerRadii::circular(1.0))
    );
}

#[test]
fn tinted_coverage_keeps_one_straight_color_at_every_alpha() {
    let mask = BlurredCoverageMask {
        coverage: image::GrayImage::from_raw(3, 1, vec![1, 127, 255])
            .expect("test mask dimensions"),
        raster_clip: None,
        overflow_pt: 0.0,
        filter_dpi: 96.0,
    };
    let raster = mask
        .tinted_raster((0.0, 105.0 / 255.0, 92.0 / 255.0, 1.0))
        .expect("colored coverage");
    let decoded = image::load_from_memory(&raster.asset.data)
        .expect("encoded mask raster")
        .to_rgba8();

    assert!(decoded.pixels().all(|pixel| pixel.0[..3] == [0, 105, 92]));
    assert_eq!(
        decoded.pixels().map(|pixel| pixel[3]).collect::<Vec<_>>(),
        [1, 127, 255]
    );
}

#[test]
fn inset_pdf_mask_keeps_source_and_device_blur_bounds_distinct() {
    let shadow = BoxShadow {
        offset_x: 0.0,
        offset_y: 0.0,
        blur: 13.5,
        spread: 12.0,
        color: Color::rgba8(1, 87, 155, 217),
        color_source: ColorSource::Absolute,
        inset: true,
    };
    let mask = blur_inset_shadow_mask(123.0, 63.0, CornerRadii::circular(18.0), &shadow, 300.0)
        .expect("finite inset shadow mask");

    assert_eq!(mask.coverage().dimensions(), (717, 467));
    assert!((mask.overflow_pt - 24.48).abs() < 0.000_1);
}