1use std::io::Read;
20
21use components::header::{Header, SecondHeader};
22use components::metadata::Metadata;
23use components::transformations::Transform;
24use decoding_image::DecodingImage;
25
26pub use decoder::Decoder;
27pub use error::{Error, Result};
28
29pub mod components;
30mod decoder;
31mod decoding_image;
32mod error;
33mod maniac;
34mod numbers;
35mod pixels;
36
37pub struct Flif {
38 info: FlifInfo,
39 raw: Box<[u8]>,
40}
41
42impl Flif {
43 pub fn decode<R: Read>(reader: R) -> Result<Self> {
44 Decoder::new(reader)?.decode_image()
45 }
46
47 pub fn decode_with_limits<R: Read>(reader: R, limits: Limits) -> Result<Self> {
48 Decoder::with_limits(reader, limits)?.decode_image()
49 }
50
51 pub fn info(&self) -> &FlifInfo {
52 &self.info
53 }
54
55 pub fn raw(&self) -> &Box<[u8]> {
56 &self.raw
57 }
58
59 pub fn into_raw(self) -> Box<[u8]> {
60 self.raw
61 }
62}
63
64#[derive(Copy, Clone, Debug, Eq, PartialEq)]
66pub struct Limits {
67 pub metadata_chunk: u32,
69 pub metadata_count: u32,
71 pub pixels: u64,
73 pub maniac_nodes: u32,
75}
76
77impl Default for Limits {
78 fn default() -> Self {
79 Self {
80 metadata_chunk: 1 << 20,
81 metadata_count: 8,
82 pixels: 1 << 26,
83 maniac_nodes: 1 << 14,
84 }
85 }
86}
87
88#[derive(Debug)]
89pub struct FlifInfo {
90 pub header: Header,
91 pub metadata: Vec<Metadata>,
92 pub second_header: SecondHeader,
93 transform: Box<Transform>,
94}