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}