embedded_png/lib.rs
1//! DOC not suitable for 16bits usize
2
3extern crate core;
4
5mod png;
6mod error;
7mod types;
8mod inflate;
9mod colors;
10
11pub use crate::png::ParsedPng;
12pub use crate::inflate::ChunkDecompressor;
13pub use crate::colors::{AlphaColor, IgnoreAlpha, DontDraw, WithBackground};
14
15/*
16pub type Png<C> = BufferedPng<C>;
17
18
19pub struct BufferedPng<C> {
20 pub header: PngHeader,
21 pub data: Vec<C>,
22}
23
24impl<C: PixelColor + Default + From<Rgb888>> BufferedPng<C> {
25 // TODO from_bytes
26 pub fn from_slice(bytes: &[u8]) -> Result<Self, DecodeError> {
27 // TODO decode / uncompress using iterators
28 let mut undecoded = pre_decode(bytes)?;
29
30 // For now, output data is always RGBA, 1 byte per channel.
31 let mut data = vec![C::default(); undecoded.header.width as usize * undecoded.header.height as usize];
32 let width = undecoded.header.width as usize;
33
34 undecoded.process_scanlines(|scanline_iter,xy_calculator,y| {
35 for (idx, (r, g, b, a)) in scanline_iter.enumerate() {
36 let (x, y) = xy_calculator.get_xy(idx, y);
37 let i = (y * width) + x;
38 data[i] = C::from(Rgb888::new(r, g, b));
39 }
40 },
41 )?;
42
43 Ok(Png {header: undecoded.header, data })
44
45 }
46}
47
48impl<C: PixelColor> OriginDimensions for BufferedPng<C> {
49 fn size(&self) -> Size {
50 Size::new(self.header.width, self.header.height)
51 }
52}
53
54impl<C: PixelColor> ImageDrawable for BufferedPng<C> {
55 type Color = C;
56
57 fn draw<D>(&self, target: &mut D) -> Result<(), D::Error> where D: DrawTarget<Color=Self::Color> {
58 let area = self.bounding_box();
59 target.fill_contiguous(&area, self.data.iter().copied())
60 }
61
62 fn draw_sub_image<D>(&self, target: &mut D, area: &Rectangle) -> Result<(), D::Error> where D: DrawTarget<Color=Self::Color> {
63 let mut index = area.top_left.x + area.top_left.y * self.header.width as i32;
64 let line_size = Size::new(area.size.width, 1);
65 for i in 0 .. area.size.height as i32 {
66 let pos = Point::new(0, i);
67 let target_area = Rectangle::new(pos, line_size);
68 let data = &self.data[index as usize .. index as usize + area.size.width as usize];
69 target.fill_contiguous(&target_area, data.iter().copied())?;
70 index += self.header.width as i32;
71 }
72 Ok(())
73 }
74}
75*/
76
77fn read_u32(bytes: &[u8], offset: usize) -> u32 {
78 u32::from_be_bytes([bytes[offset], bytes[offset + 1], bytes[offset + 2], bytes[offset + 3]])
79}
80
81
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86
87 #[test]
88 fn it_works() {
89 //let result = add(2, 2);
90 assert_eq!(4, 4);
91 }
92}