1 | /* |
2 | * Copyright (c) 2023. |
3 | * |
4 | * This software is free software; |
5 | * |
6 | * You can redistribute it or modify it under terms of the MIT, Apache License or Zlib license |
7 | */ |
8 | |
9 | //!This crate provides a library for decoding valid |
10 | //! ITU-T Rec. T.851 (09/2005) ITU-T T.81 (JPEG-1) or JPEG images. |
11 | //! |
12 | //! |
13 | //! |
14 | //! # Features |
15 | //! - SSE and AVX accelerated functions to speed up certain decoding operations |
16 | //! - FAST and accurate 32 bit IDCT algorithm |
17 | //! - Fast color convert functions |
18 | //! - RGBA and RGBX (4-Channel) color conversion functions |
19 | //! - YCbCr to Luma(Grayscale) conversion. |
20 | //! |
21 | //! # Usage |
22 | //! Add zune-jpeg to the dependencies in the project Cargo.toml |
23 | //! |
24 | //! ```toml |
25 | //! [dependencies] |
26 | //! zune_jpeg = "0.3" |
27 | //! ``` |
28 | //! # Examples |
29 | //! |
30 | //! ## Decode a JPEG file with default arguments. |
31 | //!```no_run |
32 | //! use std::fs::read; |
33 | //! use zune_jpeg::JpegDecoder; |
34 | //! let file_contents = read("a_jpeg.file" ).unwrap(); |
35 | //! let mut decoder = JpegDecoder::new(&file_contents); |
36 | //! let mut pixels = decoder.decode().unwrap(); |
37 | //! ``` |
38 | //! |
39 | //! ## Decode a JPEG file to RGBA format |
40 | //! |
41 | //! - Other (limited) supported formats are and BGR, BGRA |
42 | //! |
43 | //!```no_run |
44 | //! use zune_core::colorspace::ColorSpace; |
45 | //! use zune_core::options::DecoderOptions; |
46 | //! use zune_jpeg::JpegDecoder; |
47 | //! |
48 | //! let mut options = DecoderOptions::default().jpeg_set_out_colorspace(ColorSpace::RGBA); |
49 | //! |
50 | //! let mut decoder = JpegDecoder::new_with_options(&[],options); |
51 | //! let pixels = decoder.decode().unwrap(); |
52 | //! ``` |
53 | //! |
54 | //! ## Decode an image and get it's width and height. |
55 | //!```no_run |
56 | //! use zune_jpeg::JpegDecoder; |
57 | //! |
58 | //! let mut decoder = JpegDecoder::new(&[]); |
59 | //! decoder.decode_headers().unwrap(); |
60 | //! let image_info = decoder.info().unwrap(); |
61 | //! println!("{},{}" ,image_info.width,image_info.height) |
62 | //! ``` |
63 | //! # Crate features. |
64 | //! This crate tries to be as minimal as possible while being extensible |
65 | //! enough to handle the complexities arising from parsing different types |
66 | //! of jpeg images. |
67 | //! |
68 | //! Safety is a top concern that is why we provide both static ways to disable unsafe code, |
69 | //! disabling x86 feature, and dynamic ,by using [`DecoderOptions::set_use_unsafe(false)`], |
70 | //! both of these disable platform specific optimizations, which reduce the speed of decompression. |
71 | //! |
72 | //! Please do note that careful consideration has been taken to ensure that the unsafe paths |
73 | //! are only unsafe because they depend on platform specific intrinsics, hence no need to disable them |
74 | //! |
75 | //! The crate tries to decode as many images as possible, as a best effort, even those violating the standard |
76 | //! , this means a lot of images may get silent warnings and wrong output, but if you are sure you will be handling |
77 | //! images that follow the spec, set `ZuneJpegOptions::set_strict` to true. |
78 | //! |
79 | //![`DecoderOptions::set_use_unsafe(false)`]: https://docs.rs/zune-core/0.2.1/zune_core/options/struct.DecoderOptions.html#method.set_use_unsafe |
80 | |
81 | #![warn ( |
82 | clippy::correctness, |
83 | clippy::perf, |
84 | clippy::pedantic, |
85 | clippy::inline_always, |
86 | clippy::missing_errors_doc, |
87 | clippy::panic |
88 | )] |
89 | #![allow ( |
90 | clippy::needless_return, |
91 | clippy::similar_names, |
92 | clippy::inline_always, |
93 | clippy::similar_names, |
94 | clippy::doc_markdown, |
95 | clippy::module_name_repetitions, |
96 | clippy::missing_panics_doc, |
97 | clippy::missing_errors_doc |
98 | )] |
99 | // no_std compatibility |
100 | #![deny (clippy::std_instead_of_alloc, clippy::alloc_instead_of_core)] |
101 | #![cfg_attr (not(feature = "x86" ), forbid(unsafe_code))] |
102 | #![cfg_attr (not(feature = "std" ), no_std)] |
103 | #![macro_use ] |
104 | extern crate alloc; |
105 | extern crate core; |
106 | |
107 | pub use zune_core; |
108 | |
109 | pub use crate::decoder::{ImageInfo, JpegDecoder}; |
110 | |
111 | mod bitstream; |
112 | mod color_convert; |
113 | mod components; |
114 | mod decoder; |
115 | pub mod errors; |
116 | mod headers; |
117 | mod huffman; |
118 | #[cfg (not(fuzzing))] |
119 | mod idct; |
120 | #[cfg (fuzzing)] |
121 | pub mod idct; |
122 | mod marker; |
123 | mod mcu; |
124 | mod mcu_prog; |
125 | mod misc; |
126 | mod unsafe_utils; |
127 | mod unsafe_utils_avx2; |
128 | mod unsafe_utils_neon; |
129 | mod upsampler; |
130 | mod worker; |
131 | |