use zenpixels::{PixelDescriptor, PixelFormat};
pub fn negotiate_pixel_format(
preferred: &[PixelDescriptor],
available: &[PixelDescriptor],
) -> Option<PixelDescriptor> {
if available.is_empty() {
return None;
}
for pref in preferred {
for avail in available {
if *avail == *pref {
return Some(*avail);
}
}
for avail in available {
if avail.pixel_format() == pref.pixel_format() {
return Some(*avail);
}
}
}
Some(available[0])
}
pub fn best_encode_format(
source: PixelDescriptor,
supported: &[PixelDescriptor],
) -> Option<PixelDescriptor> {
for s in supported {
if *s == source {
return Some(*s);
}
}
for s in supported {
if s.pixel_format() == source.pixel_format() {
return Some(*s);
}
}
None
}
pub fn is_format_available(target: PixelFormat, available: &[PixelDescriptor]) -> bool {
available.iter().any(|a| a.pixel_format() == target)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn exact_match_wins() {
let preferred = &[PixelDescriptor::RGBA8_SRGB];
let available = &[PixelDescriptor::RGB8_SRGB, PixelDescriptor::RGBA8_SRGB];
assert_eq!(
negotiate_pixel_format(preferred, available),
Some(PixelDescriptor::RGBA8_SRGB)
);
}
#[test]
fn format_match_ignores_transfer() {
let preferred = &[PixelDescriptor::RGB8_SRGB];
let available = &[PixelDescriptor::RGB8]; let picked = negotiate_pixel_format(preferred, available).unwrap();
assert_eq!(picked.pixel_format(), PixelDescriptor::RGB8.pixel_format());
assert_eq!(picked, PixelDescriptor::RGB8); }
#[test]
fn preference_order_respected() {
let preferred = &[PixelDescriptor::RGBA8_SRGB, PixelDescriptor::RGB8_SRGB];
let available = &[PixelDescriptor::RGB8_SRGB];
assert_eq!(
negotiate_pixel_format(preferred, available),
Some(PixelDescriptor::RGB8_SRGB)
);
}
#[test]
fn fallback_to_first_available() {
let preferred = &[PixelDescriptor::GRAY8_SRGB];
let available = &[PixelDescriptor::RGB8_SRGB, PixelDescriptor::RGBA8_SRGB];
assert_eq!(
negotiate_pixel_format(preferred, available),
Some(PixelDescriptor::RGB8_SRGB)
);
}
#[test]
fn empty_preferred_uses_default() {
let available = &[PixelDescriptor::RGBA8_SRGB, PixelDescriptor::RGB8_SRGB];
assert_eq!(
negotiate_pixel_format(&[], available),
Some(PixelDescriptor::RGBA8_SRGB)
);
}
#[test]
fn first_preference_wins_over_later() {
let preferred = &[PixelDescriptor::RGB8_SRGB, PixelDescriptor::RGBA8_SRGB];
let available = &[PixelDescriptor::RGBA8_SRGB, PixelDescriptor::RGB8_SRGB];
assert_eq!(
negotiate_pixel_format(preferred, available),
Some(PixelDescriptor::RGB8_SRGB)
);
}
#[test]
fn empty_available_returns_none() {
assert_eq!(
negotiate_pixel_format(&[PixelDescriptor::RGB8_SRGB], &[]),
None
);
}
#[test]
fn best_encode_exact() {
let supported = &[PixelDescriptor::RGB8_SRGB, PixelDescriptor::RGBA8_SRGB];
assert_eq!(
best_encode_format(PixelDescriptor::RGBA8_SRGB, supported),
Some(PixelDescriptor::RGBA8_SRGB)
);
}
#[test]
fn best_encode_format_match() {
let supported = &[PixelDescriptor::RGB8]; assert_eq!(
best_encode_format(PixelDescriptor::RGB8_SRGB, supported),
Some(PixelDescriptor::RGB8)
);
}
#[test]
fn best_encode_no_match() {
let supported = &[PixelDescriptor::RGBA8_SRGB];
assert_eq!(
best_encode_format(PixelDescriptor::GRAY8_SRGB, supported),
None
);
}
#[test]
fn is_format_available_found() {
let available = &[PixelDescriptor::RGB8_SRGB, PixelDescriptor::GRAY8_SRGB];
assert!(is_format_available(
PixelDescriptor::RGB8_SRGB.pixel_format(),
available
));
}
#[test]
fn is_format_available_not_found() {
let available = &[PixelDescriptor::RGB8_SRGB];
assert!(!is_format_available(
PixelDescriptor::RGBA8_SRGB.pixel_format(),
available
));
}
}