aboutsummaryrefslogtreecommitdiff
path: root/vendor/exr/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/exr/README.md')
-rw-r--r--vendor/exr/README.md303
1 files changed, 303 insertions, 0 deletions
diff --git a/vendor/exr/README.md b/vendor/exr/README.md
new file mode 100644
index 0000000..04e5419
--- /dev/null
+++ b/vendor/exr/README.md
@@ -0,0 +1,303 @@
+[![Rust Docs](https://docs.rs/exr/badge.svg)](https://docs.rs/exr)
+[![Rust Crate](https://img.shields.io/crates/v/exr.svg)](https://crates.io/crates/exr)
+[![Rust Lang Version](https://img.shields.io/badge/rustc-1.59.0-lightgray.svg)](https://blog.rust-lang.org/2022/02/24/Rust-1.59.0.html)
+[![Wasm Ready](https://img.shields.io/badge/wasm-supported-%236d0)](https://github.com/johannesvollmer/exrs/actions?query=branch%3Amaster)
+[![downloads](https://img.shields.io/crates/d/exr)](https://crates.io/crates/exr)
+[![Lines of Code](https://tokei.rs/b1/github/johannesvollmer/exrs?category=code)](https://tokei.rs)
+
+# EXRS
+
+This library is a 100% Rust and 100% safe code library for
+reading and writing OpenEXR images.
+
+[OpenEXR](http://www.openexr.com/)
+is the de-facto standard image format in animation, VFX, and
+other computer graphics pipelines, for it can represent an immense variety of pixel data with lossless compression.
+
+Features include:
+- any number of layers placed anywhere in 2d space, like in Photoshop
+- any set of channels in an image (rgb, xyz, lab, depth, motion, mask, anything, ...)
+- three types of high dynamic range values (16bit float, 32bit float, 32bit unsigned integer) per channel
+- uncompressed pixel data for fast file access
+- lossless compression for any image type
+- lossy compression for non-deep image types to produce very small files
+- load specific sections of an image without processing the whole file
+- compress and decompress image pixels on multiple threads in parallel
+- add arbitrary meta data to any image, including custom byte data, with full backwards compatibility
+- any number of samples per pixel ("deep data") (not yet supported)
+
+### Current Status
+
+This library has matured quite a bit, but should still be considered incomplete.
+For example, deep data and DWA compression algorithms are not supported yet.
+
+If you encounter an exr file that cannot be opened by this crate but should be,
+please leave an issue on this repository, containing the image file.
+
+The focus is set on supporting all feature and correctness;
+some performance optimizations are to be done.
+
+__What we can do:__
+
+- Supported OpenEXR Features
+ - [x] custom attributes
+ - [x] multi-part images (multiple layers, like Photoshop)
+ - [x] multi-resolution images (mip maps, rip maps)
+ - [x] access meta data and raw pixel blocks independently
+ - [x] automatically crop away transparent pixels of an image (opt-in)
+ - [ ] channel subsampling
+ - [ ] deep data
+ - [x] compression methods
+ - [x] uncompressed
+ - [x] zip line (lossless)
+ - [x] zip block (lossless)
+ - [x] rle (lossless)
+ - [x] piz (lossless) (huge thanks to @dgsantana)
+ - [x] pxr24 (lossless for f16 and u32)
+ - [x] little-endian architectures
+ - [ ] big-endian architectures __(help wanted)__
+ - [x] b44, b44a (huge thanks to @narann)
+ - [ ] dwaa, dwab __(help wanted)__
+
+- Nice Things
+ - [x] no unsafe code, no undefined behaviour
+ - [x] no CMake required or environment variables required
+ - [x] re-imagined exr api with low barrier of entry
+ (see `read_rgba_file`, `write_rgba_file`, `read_all_data_from_file`),
+ plus embracing common high-level Rust abstractions
+ - [x] a full-fledged image data structure that can contain any exr image,
+ can open any image with a single function call (`read_all_data_from_file`)
+ without knowing anything about the file in advance
+ - [x] decompress and decompress image sections either
+ in parallel or with low memory overhead
+ - [x] read and write progress callback
+ - [x] write blocks streams, one after another
+ - [x] memory mapping automatically supported
+ by using the generic `std::io::Read` and `std::io::Write` traits
+
+
+<!-- detailed internal feature checklist:
+- [x] Inspecting Metadata
+ - [x] Singlepart
+ - [x] Tiles
+ - [x] Scan lines
+ - [x] Deep Tiles
+ - [ ] Deep Scan Lines _(coded, but untested)_
+ - [x] Multipart
+ - [x] Tiles
+ - [x] Scan lines
+ - [ ] Deep Tiles _(coded, but untested)_
+ - [x] Deep Scan Lines
+ - [x] Multi Resolution
+ - [x] Singular Resolution
+ - [x] MipMaps
+ - [x] RipMaps _(coded, but untested)_
+ - [x] Non-Standard Attributes
+ - [x] Reading those with known names and unknown names
+ - [x] Reading those with known types
+ - [x] Reading those with unknown types into a plain byte buffer
+ - [x] Nice API for preview attribute extraction
+
+- [ ] Decompressing Pixel Data
+ - [x] Any LineOrder
+ - [x] Any Pixel Type (`f16`, `f32`, `u32`)
+ - [x] Multipart
+ - [ ] Deep Data
+ - [x] Rip/Mip Maps _(coded, but untested)_
+ - [ ] Nice API for RGBA conversion and displaying other color spaces?
+ - [ ] Compression Methods
+ - [x] Uncompressed
+ - [x] ZIPS
+ - [x] ZIP
+ - [x] RLE
+ - [x] PIZ
+ - [x] RXR24
+ - [x] B44, B44A
+ - [ ] DWAA, DWAB
+
+- [ ] Writing images
+ - [x] Scan Lines
+ - [x] Tiles
+ - [x] Multipart
+ - [ ] Deep Data
+ - [x] User supplied line order
+ - [x] Rip/Mip Maps _(coded, but untested)_
+ - [x] 100% correct meta data
+ - [x] Compression Methods
+ - [x] Uncompressed
+ - [x] ZIPS (lossless)
+ - [x] ZIP (lossless)
+ - [x] RLE (lossless)
+ - [x] PIZ (lossless)
+ - [x] PXR24 (lossless for f16 and u32)
+ - [x] B44, B44A
+ - [ ] DWAA, DWAB
+
+- [x] De/compressing multiple blocks in parallel
+
+- [ ] Profiling and real optimization
+ - [x] Memory Mapping
+
+- [x] IO Progress callback?
+- [ ] SIMD
+- [x] Detailed file validation
+ - [x] Channels with an x or y sampling rate other than 1 are allowed only in flat, scan-line based images.
+ - [x] If the headers include timeCode and chromaticities attributes, then the values of those attributes must also be the same for all parts of a file
+ - [x] Scan-line based images cannot be multi-resolution images. (encoded in type system)
+ - [x] Scan-line based images cannot have unspecified line order apparently?
+ - [x] layer name is required for multipart images
+ - [x] Enforce minimum length of 1 for arrays
+ - [x] [Validate data_window matches data size when writing images] is not required because one is inferred from the other
+ - [x] Channel names and layer names must be unique
+
+- [x] Explore different APIs
+ - [x] Let user decide how to store data
+ - [x] Loading Metadata and specific tiles or blocks separately
+-->
+
+
+### Usage
+
+Add this to your `Cargo.toml`:
+```toml
+[dependencies]
+exr = "1.71.0"
+
+# also, optionally add this to your crate for smaller binary size
+# and better runtime performance
+[profile.release]
+lto = true
+```
+
+The master branch of this repository always matches the `crates.io` version,
+so you could also link the github repository master branch.
+
+### Example
+
+Example: [generate an rgb exr file](https://github.com/johannesvollmer/exrs/blob/master/examples/0_write_rgba.rs).
+
+```rust
+extern crate exr;
+
+/// To write your image data, you need to specify how to retrieve a single pixel from it.
+/// The closure may capture variables or generate data on the fly.
+fn main() {
+ use exr::prelude::*;
+
+ // write a file, with 32-bit float precision per channel
+ write_rgba_file(
+
+ // this accepts paths or &str
+ "minimal_rgba.exr",
+
+ // image resolution is 2k
+ 2048, 2048,
+
+ // generate (or lookup in your own image)
+ // an f32 rgb color for each of the 2048x2048 pixels
+ // (you could also create f16 values here to save disk space)
+ |x,y| {
+ (
+ x as f32 / 2048.0, // red
+ y as f32 / 2048.0, // green
+ 1.0 - (y as f32 / 2048.0), // blue
+ 1.0 // alpha
+ )
+ }
+
+ ).unwrap();
+}
+```
+
+See the [the examples folder](https://github.com/johannesvollmer/exrs/tree/master/examples) for more examples.
+
+Or read [the guide](https://github.com/johannesvollmer/exrs/tree/master/GUIDE.md).
+
+
+### Goals
+
+`exrs` aims to provide a safe and convenient
+interface to the OpenEXR file format. It is designed
+to minimize the possibility of invalid files and runtime errors.
+It contains a full-fledged image data structure that can contain any exr image,
+but also grants access a low level block interface.
+
+This library does not try to be a general purpose image file or image processing library.
+Therefore, color conversion, beautiful subsampling, and mip map generation are left to other crates for now.
+As the original OpenEXR implementation supports those operations, this library may choose to support them later.
+Furthermore, this implementation does not try to produce byte-exact file output
+matching the original implementation, instead, it is only aimed for correct output.
+
+#### Safety
+
+This library uses no unsafe code. In fact, this crate is annotated with `#[forbid(unsafe_code)]`.
+Some dependencies use unsafe code, though this is minimized by selecting dependencies carefully.
+
+All information from a file is handled with caution.
+Allocations have a safe maximum size that will not be exceeded at once,
+to reduce memory exhaustion attacks.
+
+### What I am proud of
+
+- Flexible API (choose how to store your data instead of receiving an allocated image)
+- Safe API (almost impossible to accidentally write invalid files)
+- "if it compiles, it runs" methodology
+- [Awesome Contributors!](CONTRIBUTORS.md)
+
+### Wasm
+This crate supports the `wasm-unknown-unknown` target.
+Until WASM has threads, decoding and encoding will be slower for compressed files.
+Of course, you will need to read from byte buffers instead of file handles.
+
+### Motivation
+
+This library does not support the toxic mindset of
+rewriting existing C++ code in Rust just for the sake of switching the language.
+The OpenEXR image format is defined by a proven
+and battle-tested reference implementation.
+
+However, as an alternative to the official reference implementation,
+this library has the opportunity to explore radically different
+designs, no matter what language it is written in. Neat!
+
+Also, I really wanted to have a library
+which had an 'X' in its name in my git repositories.
+
+Keep in mind that there are official Rust bindings to the C++ reference implementation,
+and they offer several advantages over this Rust implementation:
+- they support all the features and can read any file, no surprises
+- they are constantly driven by industry giants,
+ so they have the higher probability of still being maintained in a decade
+- they are battle tested and relied upon by a lot of existing projects
+
+### Specification
+
+This library is modeled after the
+official [`OpenEXRFileLayout.pdf`](http://www.openexr.com/documentation.html)
+document. Unspecified behavior is concluded from the C++ library.
+
+### Roadmap
+1. Support all compression formats (missing format: DWAA/DWAB)
+1. Support subsampling
+1. Support Deep Data
+1. Automatic conversion between color spaces
+1. Profiling and other optimization
+1. Tooling (Image Viewer App, Metadata Extraction Tool, ...)
+
+## Contributing
+This project has awesome contributors and is welcoming for
+contributions on [Github](https://github.com/johannesvollmer/exrs).
+
+### Running Tests
+
+To run all fast tests on your native system, use `cargo test`.
+
+To start fuzzing on your native system indefinitely,
+use `cargo test --package exr --test fuzz fuzz -- --exact --ignored`.
+
+To run all fast tests on an emulated system, use one of the following commands.
+Each command requires a running `docker` instance,
+and `cross-rs` to be installed on your machine (`cargo install cross-rs`).
+- Mips (Big Endian) `cross test --target mips-unknown-linux-gnu --verbose`
+
+To benchmark the library, simply run `cargo bench`. \ No newline at end of file