//! # PNG encoder and decoder
//! This crate contains a PNG encoder and decoder. It supports reading of single lines or whole frames.
//! ## The decoder
//! The most important types for decoding purposes are [`Decoder`](struct.Decoder.html) and
//! [`Reader`](struct.Reader.html). They both wrap a `std::io::Read`.
//! `Decoder` serves as a builder for `Reader`. Calling `Decoder::read_info` reads from the `Read` until the
//! image data is reached.
//! ### Using the decoder
//!     use std::fs::File;
//!
//!     // The decoder is a build for reader and can be used to set various decoding options
//!     // via `Transformations`. The default output transformation is `Transformations::EXPAND
//!     // | Transformations::STRIP_ALPHA`.
//!     let decoder = png::Decoder::new(File::open("tests/pngsuite/basi0g01.png").unwrap());
//!     let (info, mut reader) = decoder.read_info().unwrap();
//!     // Allocate the output buffer.
//!     let mut buf = vec![0; info.buffer_size()];
//!     // Read the next frame. Currently this function should only called once.
//!     // The default options
//!     reader.next_frame(&mut buf).unwrap();
//! ## Encoder
//! ### Using the encoder
//! ```ignore
//!     // For reading and opening files
//!     use std::path::Path;
//!     use std::fs::File;
//!     use std::io::BufWriter;
//!     // To use encoder.set()
//!     use png::HasParameters;
//!
//!     let path = Path::new(r"/path/to/image.png");
//!     let file = File::create(path).unwrap();
//!     let ref mut w = BufWriter::new(file);
//!
//!     let mut encoder = png::Encoder::new(w, 2, 1); // Width is 2 pixels and height is 1.
//!     encoder.set(png::ColorType::RGBA).set(png::BitDepth::Eight);
//!      let mut writer = encoder.write_header().unwrap();
//!
//!     let data = [255, 0, 0, 255, 0, 0, 0, 255]; // An array containing a RGBA sequence. First pixel is red and second pixel is black.
//!     writer.write_image_data(&data).unwrap(); // Save
//! ```
//!
//#![cfg_attr(test, feature(test))]

#[macro_use] extern crate bitflags;

extern crate num_iter;

pub mod chunk;
mod crc;
mod decoder;
#[cfg(feature = "png-encoding")]
mod encoder;
mod filter;
mod traits;
mod common;
mod utils;

pub use common::*;
pub use decoder::{Decoder, Reader, OutputInfo, StreamingDecoder, Decoded, DecodingError, Limits};
#[cfg(feature = "png-encoding")]
pub use encoder::{Encoder, Writer, EncodingError};
pub use filter::FilterType;

pub use traits::{Parameter, HasParameters};
