mirx 0.44.0

MIRX binary image format — flat & chunk-based container for ahead-of-time UI assets
Documentation
use super::super::{EncodedImageView, preflight::Preflight, tests::payload};
use super::*;
use crate::{
    PayloadLimits,
    coding::Rle,
    image::{ColorDescription, GroupPlanes, SampleLayout},
};

#[test]
fn native_and_wire_groups_share_coverage_indexes_alignment_and_work() {
    let surface = SurfaceDescriptor::new(
        3,
        2,
        SampleLayout::NV12,
        ColorDescription::BT709_YUV_LIMITED,
    )
    .unwrap();
    let codings = [Rle::new().record(), Rle::new().record()];
    let records = [
        UnitGroupRecord::new(0, 0..2)
            .unwrap()
            .with_planes(GroupPlanes::Plane(0)),
        UnitGroupRecord::new(1, 64..66)
            .unwrap()
            .with_planes(GroupPlanes::Plane(1))
            .with_input_alignment(crate::ByteAlignment::new(64).unwrap()),
    ];
    let mut data = [0; 66];
    data[..2].copy_from_slice(&[0x85, 42]);
    data[64..].copy_from_slice(&[0x83, 128]);
    for mode in 0..5 {
        let mut records = records;
        let mut data = data;
        match mode {
            1 => records[1] = records[1].with_planes(GroupPlanes::Plane(0)),
            2 => records[1] = records[1].with_reference(ReferenceMode::Previous),
            3 => data[64] = 0xff,
            4 => {
                records[1] = records[1]
                    .with_index_offset(1)
                    .with_index_encoding(crate::media::UnitIndexEncoding::Offsets)
            }
            _ => {}
        }
        let native = GroupSource {
            surface,
            codings: CodingRecords::Native(&codings),
            records: GroupRecords::Native(&records),
            data: &data,
            indexes: &[],
            file_offset: None,
            data_offset: 0,
        };
        let bytes = payload(surface, &codings, Some(&records), None, &data, None, None);
        let wire = EncodedImageView::open(&bytes).unwrap().group_source();
        assert_eq!(native.input_alignment(), wire.input_alignment());
        for work in [0, 1, 16, 128, 512, 2048] {
            let mut a = CoverageBudget::new(work);
            let mut b = CoverageBudget::new(work);
            assert_eq!(native.validate_groups(&mut a), wire.validate_groups(&mut b));
            assert_eq!(a.remaining(), b.remaining());
            let limits = PayloadLimits::EMBEDDED.with_max_raster_work(work);
            let mut a = Preflight::new(&limits, 2).unwrap();
            let mut b = Preflight::new(&limits, 2).unwrap();
            assert_eq!(a.groups(native), b.groups(wire));
        }
        if mode == 0 {
            let mut preflight = Preflight::new(&PayloadLimits::EMBEDDED, 2).unwrap();
            preflight.groups(native).unwrap();
            assert_eq!(
                native.record(2),
                Err(EncodedImageError::GroupOutOfBounds(2))
            );
        }
    }
}

#[test]
fn native_records_cannot_bypass_wire_field_validation_or_implicit_rules() {
    let surface = SurfaceDescriptor::new(4, 1, SampleLayout::A8, ColorDescription::NONE).unwrap();
    let codings = [Rle::new().record()];
    let source = GroupSource {
        surface,
        codings: CodingRecords::Native(&codings),
        records: GroupRecords::Implicit,
        data: &[0x83, 42],
        indexes: &[],
        file_offset: None,
        data_offset: 0,
    };
    source
        .validate_groups(&mut CoverageBudget::new(100))
        .unwrap();
    assert!(crate::ByteAlignment::new(3).is_err());
    let empty = GroupSource {
        records: GroupRecords::Native(&[]),
        ..source
    };
    assert_eq!(
        empty.validate_groups(&mut CoverageBudget::new(100)),
        Err(EncodedImageError::InvalidGroupTableLength(0))
    );
    let ambiguous = GroupSource {
        indexes: &[0],
        ..source
    };
    assert_eq!(
        ambiguous.validate_groups(&mut CoverageBudget::new(100)),
        Err(EncodedImageError::AmbiguousImplicitGroup)
    );
}