mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-15 21:57:04 +00:00
style: cargo fmt
This commit is contained in:
@@ -20,8 +20,7 @@ const XMP: &str = "http://ns.adobe.com/xap/1.0/"; // brand-ok: the XMP namespace
|
||||
pub(crate) const XMP_RIGHTS: &str = "http://ns.adobe.com/xap/1.0/rights/"; // brand-ok: the XMP namespace the files use
|
||||
const PDF: &str = "http://ns.adobe.com/pdf/1.3/"; // brand-ok: the XMP namespace the files use
|
||||
|
||||
const XMP_NAMESPACES: Canonical<'static> =
|
||||
Canonical::new(&[("rdf", RDF), ("dc", DC), ("xmp", XMP), ("xmpRights", XMP_RIGHTS), ("pdf", PDF)]);
|
||||
const XMP_NAMESPACES: Canonical<'static> = Canonical::new(&[("rdf", RDF), ("dc", DC), ("xmp", XMP), ("xmpRights", XMP_RIGHTS), ("pdf", PDF)]);
|
||||
|
||||
/// The File Info fields a PDF gives, each `None` when the file gives none (or only blank text).
|
||||
#[derive(Clone, Debug, Default, PartialEq, Eq)]
|
||||
@@ -146,10 +145,7 @@ fn property(descriptions: &[&El], name: &str) -> Vec<String> {
|
||||
fn items(p: &El) -> Vec<String> {
|
||||
let array = p.elements().find(|c| matches!(c.name.as_str(), "rdf:Seq" | "rdf:Bag" | "rdf:Alt"));
|
||||
let mut values: Vec<(bool, String)> = match array {
|
||||
Some(a) => a
|
||||
.children("rdf:li")
|
||||
.map(|li| (li.attr("xml:lang").is_some_and(|l| l.eq_ignore_ascii_case("x-default")), value_of(li)))
|
||||
.collect(),
|
||||
Some(a) => a.children("rdf:li").map(|li| (li.attr("xml:lang").is_some_and(|l| l.eq_ignore_ascii_case("x-default")), value_of(li))).collect(),
|
||||
None => vec![(false, value_of(p))],
|
||||
};
|
||||
// A stable sort: the `x-default` item first, the others in their order.
|
||||
|
||||
@@ -233,7 +233,11 @@ fn maximum_editability_writes_groups_and_an_object_per_layer() {
|
||||
assert_eq!(p.records[6].rect, [0, 0, 6, 6]);
|
||||
let psd = craft_psd::PsdFile::from_bytes(&file).unwrap();
|
||||
let content_layers = psd.layers().iter().filter(|l| matches!(l.section_type(), craft_psd::layer::SectionType::Other)).count();
|
||||
let groups = psd.layers().iter().filter(|l| matches!(l.section_type(), craft_psd::layer::SectionType::OpenFolder | craft_psd::layer::SectionType::ClosedFolder)).count();
|
||||
let groups = psd
|
||||
.layers()
|
||||
.iter()
|
||||
.filter(|l| matches!(l.section_type(), craft_psd::layer::SectionType::OpenFolder | craft_psd::layer::SectionType::ClosedFolder))
|
||||
.count();
|
||||
assert_eq!((content_layers, groups), (3, 3));
|
||||
assert_eq!(merged(&file), merged(&export(&doc, &opts(PsdOptions::default()))), "the same merged image");
|
||||
|
||||
|
||||
+24
-36
@@ -294,9 +294,7 @@ const PNG_WINDOW_AND_STEP: u64 = (32 << 10) + (8 << 10);
|
||||
/// to twice the size it holds, are both allocated: three times that size at most. A copy of a
|
||||
/// stored row and the row given out come on top. `None` when a row given out doesn't fit memory.
|
||||
fn png_row_scratch(hdr: &craft_image_codecs::PngHeader) -> Option<u64> {
|
||||
let out = u64::from(hdr.width)
|
||||
.checked_mul(u64::from(hdr.layout.channels()))?
|
||||
.checked_mul(u64::from(hdr.sample.bytes()))?;
|
||||
let out = u64::from(hdr.width).checked_mul(u64::from(hdr.layout.channels()))?.checked_mul(u64::from(hdr.sample.bytes()))?;
|
||||
// A filter byte and the row's samples.
|
||||
let stored = 1u64.checked_add(out)?;
|
||||
let kept = (stored * 4).next_multiple_of(64).max(PNG_KEPT_ROWS);
|
||||
@@ -343,44 +341,34 @@ fn shrunk(bytes: &[u8], r: &Reduction) -> Option<vello_cpu::Pixmap> {
|
||||
dec.step_stream::<CodecError>(1, &mut || true, &mut |_y, row| {
|
||||
match (hdr.layout, hdr.sample) {
|
||||
(ChannelLayout::Gray, SampleType::U8) => shrink.row(row.iter().map(|&g| [g, g, g, 255])),
|
||||
(ChannelLayout::GrayA, SampleType::U8) => {
|
||||
shrink.row(row.as_chunks::<2>().0.iter().map(|&[g, a]| [g, g, g, a]))
|
||||
}
|
||||
(ChannelLayout::Rgb, SampleType::U8) => {
|
||||
shrink.row(row.as_chunks::<3>().0.iter().map(|&[r, g, b]| [r, g, b, 255]))
|
||||
}
|
||||
(ChannelLayout::GrayA, SampleType::U8) => shrink.row(row.as_chunks::<2>().0.iter().map(|&[g, a]| [g, g, g, a])),
|
||||
(ChannelLayout::Rgb, SampleType::U8) => shrink.row(row.as_chunks::<3>().0.iter().map(|&[r, g, b]| [r, g, b, 255])),
|
||||
(ChannelLayout::Rgba, SampleType::U8) => shrink.row(row.as_chunks::<4>().0.iter().copied()),
|
||||
(ChannelLayout::Gray, SampleType::U16) => shrink.row(row.as_chunks::<2>().0.iter().map(|&g| {
|
||||
let v = (u16::from_ne_bytes(g) >> 8) as u8;
|
||||
[v, v, v, 255]
|
||||
})),
|
||||
(ChannelLayout::GrayA, SampleType::U16) => {
|
||||
shrink.row(row.as_chunks::<4>().0.iter().map(|&[g0, g1, a0, a1]| {
|
||||
let g = (u16::from_ne_bytes([g0, g1]) >> 8) as u8;
|
||||
let a = (u16::from_ne_bytes([a0, a1]) >> 8) as u8;
|
||||
[g, g, g, a]
|
||||
}))
|
||||
}
|
||||
(ChannelLayout::Rgb, SampleType::U16) => {
|
||||
shrink.row(row.as_chunks::<6>().0.iter().map(|&[r0, r1, g0, g1, b0, b1]| {
|
||||
[
|
||||
(u16::from_ne_bytes([r0, r1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([g0, g1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([b0, b1]) >> 8) as u8,
|
||||
255,
|
||||
]
|
||||
}))
|
||||
}
|
||||
(ChannelLayout::Rgba, SampleType::U16) => {
|
||||
shrink.row(row.as_chunks::<8>().0.iter().map(|&[r0, r1, g0, g1, b0, b1, a0, a1]| {
|
||||
[
|
||||
(u16::from_ne_bytes([r0, r1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([g0, g1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([b0, b1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([a0, a1]) >> 8) as u8,
|
||||
]
|
||||
}))
|
||||
}
|
||||
(ChannelLayout::GrayA, SampleType::U16) => shrink.row(row.as_chunks::<4>().0.iter().map(|&[g0, g1, a0, a1]| {
|
||||
let g = (u16::from_ne_bytes([g0, g1]) >> 8) as u8;
|
||||
let a = (u16::from_ne_bytes([a0, a1]) >> 8) as u8;
|
||||
[g, g, g, a]
|
||||
})),
|
||||
(ChannelLayout::Rgb, SampleType::U16) => shrink.row(row.as_chunks::<6>().0.iter().map(|&[r0, r1, g0, g1, b0, b1]| {
|
||||
[
|
||||
(u16::from_ne_bytes([r0, r1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([g0, g1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([b0, b1]) >> 8) as u8,
|
||||
255,
|
||||
]
|
||||
})),
|
||||
(ChannelLayout::Rgba, SampleType::U16) => shrink.row(row.as_chunks::<8>().0.iter().map(|&[r0, r1, g0, g1, b0, b1, a0, a1]| {
|
||||
[
|
||||
(u16::from_ne_bytes([r0, r1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([g0, g1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([b0, b1]) >> 8) as u8,
|
||||
(u16::from_ne_bytes([a0, a1]) >> 8) as u8,
|
||||
]
|
||||
})),
|
||||
_ => return Err(CodecError::unsupported(Format::Png, "unsupported PNG channel layout")),
|
||||
}
|
||||
Ok(())
|
||||
|
||||
@@ -42,9 +42,7 @@ pub fn decode_alpha(bytes: &[u8]) -> Result<Option<(u32, u32, Vec<u8>)>, TraceEr
|
||||
}
|
||||
let pixels = u64::from(info.width) * u64::from(info.height);
|
||||
let frame = gif_first_frame_pixels(bytes).unwrap_or(0);
|
||||
let total_bytes = pixels
|
||||
.saturating_mul(u64::from(info.channels))
|
||||
.saturating_mul(u64::from(info.bits_per_sample.max(8).div_ceil(8)));
|
||||
let total_bytes = pixels.saturating_mul(u64::from(info.channels)).saturating_mul(u64::from(info.bits_per_sample.max(8).div_ceil(8)));
|
||||
if pixels.max(frame) > MAX_PIXELS || total_bytes > ALPHA_MAX_DECODE_BYTES {
|
||||
return Err(TraceError::TooLarge { width: info.width, height: info.height, max: MAX_PIXELS >> 20 });
|
||||
}
|
||||
|
||||
@@ -162,19 +162,14 @@ impl Raster {
|
||||
if info.width == 0 || info.height == 0 {
|
||||
return Err(TraceError::Empty);
|
||||
}
|
||||
if u64::from(info.width) * u64::from(info.height) > MAX_PIXELS
|
||||
|| gif_first_frame_pixels(bytes).is_some_and(|p| p > MAX_PIXELS)
|
||||
{
|
||||
if u64::from(info.width) * u64::from(info.height) > MAX_PIXELS || gif_first_frame_pixels(bytes).is_some_and(|p| p > MAX_PIXELS) {
|
||||
return Err(TraceError::TooLarge { width: info.width, height: info.height, max: MAX_PIXELS >> 20 });
|
||||
}
|
||||
} else if gif_first_frame_pixels(bytes).is_some_and(|p| p > MAX_PIXELS) {
|
||||
return Err(TraceError::TooLarge { width: 0, height: 0, max: MAX_PIXELS >> 20 });
|
||||
}
|
||||
let opts = craft_image_codecs::DecodeOptions {
|
||||
limits: craft_image_codecs::Limits {
|
||||
max_pixels: MAX_PIXELS,
|
||||
..craft_image_codecs::Limits::default()
|
||||
},
|
||||
limits: craft_image_codecs::Limits { max_pixels: MAX_PIXELS, ..craft_image_codecs::Limits::default() },
|
||||
..craft_image_codecs::DecodeOptions::default()
|
||||
};
|
||||
let img = craft_image_codecs::decode_with(bytes, &opts).map_err(|e| TraceError::Decode(e.to_string()))?;
|
||||
@@ -198,18 +193,10 @@ impl Raster {
|
||||
return Self::decode(bytes);
|
||||
}
|
||||
if pixels > MAX_SOURCE_PIXELS {
|
||||
return Err(TraceError::TooLarge {
|
||||
width: info.width,
|
||||
height: info.height,
|
||||
max: MAX_SOURCE_PIXELS >> 20,
|
||||
});
|
||||
return Err(TraceError::TooLarge { width: info.width, height: info.height, max: MAX_SOURCE_PIXELS >> 20 });
|
||||
}
|
||||
if gif_first_frame_pixels(bytes).is_some_and(|p| p > MAX_SOURCE_PIXELS) {
|
||||
return Err(TraceError::TooLarge {
|
||||
width: info.width,
|
||||
height: info.height,
|
||||
max: MAX_SOURCE_PIXELS >> 20,
|
||||
});
|
||||
return Err(TraceError::TooLarge { width: info.width, height: info.height, max: MAX_SOURCE_PIXELS >> 20 });
|
||||
}
|
||||
} else if gif_first_frame_pixels(bytes).is_some_and(|p| p > MAX_SOURCE_PIXELS) {
|
||||
return Err(TraceError::TooLarge { width: 0, height: 0, max: MAX_SOURCE_PIXELS >> 20 });
|
||||
@@ -243,12 +230,7 @@ impl Raster {
|
||||
}
|
||||
/// Encode as PNG.
|
||||
pub fn encode_png(&self) -> Vec<u8> {
|
||||
let Ok(img) = craft_image_codecs::Image::from_u8(
|
||||
self.width,
|
||||
self.height,
|
||||
craft_image_codecs::ChannelLayout::Rgba,
|
||||
self.rgba.clone(),
|
||||
) else {
|
||||
let Ok(img) = craft_image_codecs::Image::from_u8(self.width, self.height, craft_image_codecs::ChannelLayout::Rgba, self.rgba.clone()) else {
|
||||
return Vec::new();
|
||||
};
|
||||
craft_image_codecs::encode(&img, craft_image_codecs::Format::Png, &Default::default()).unwrap_or_default()
|
||||
|
||||
@@ -2177,17 +2177,8 @@ fn small_accents_of_other_colors_leave_a_tinted_photo_continuous_tone() {
|
||||
/// `img` saved as a JPEG of `quality` and read back.
|
||||
fn through_jpeg(img: &Raster, quality: u8) -> Raster {
|
||||
let rgb: Vec<u8> = img.rgba.chunks(4).flat_map(|p| [p[0], p[1], p[2]]).collect();
|
||||
let encoded = craft_image_codecs::Image::from_u8(
|
||||
img.width,
|
||||
img.height,
|
||||
craft_image_codecs::ChannelLayout::Rgb,
|
||||
rgb,
|
||||
)
|
||||
.unwrap();
|
||||
let opts = craft_image_codecs::EncodeOptions {
|
||||
jpeg_quality: quality,
|
||||
..Default::default()
|
||||
};
|
||||
let encoded = craft_image_codecs::Image::from_u8(img.width, img.height, craft_image_codecs::ChannelLayout::Rgb, rgb).unwrap();
|
||||
let opts = craft_image_codecs::EncodeOptions { jpeg_quality: quality, ..Default::default() };
|
||||
let bytes = craft_image_codecs::encode(&encoded, craft_image_codecs::Format::Jpeg, &opts).unwrap();
|
||||
Raster::decode(&bytes).unwrap()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user