1 // Copyright 2024 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 use crate::internal_utils::*;
16 use crate::*;
17 
18 #[derive(Clone, Copy, Debug)]
19 pub struct PointerSlice<T> {
20     ptr: *mut [T],
21 }
22 
23 impl<T> PointerSlice<T> {
24     /// # Safety
25     /// `ptr` must live at least as long as the struct, and not be accessed other than through this
26     /// struct. It must point to a memory region of at least `size` elements.
create(ptr: *mut T, size: usize) -> AvifResult<Self>27     pub unsafe fn create(ptr: *mut T, size: usize) -> AvifResult<Self> {
28         if ptr.is_null() || size == 0 {
29             return Err(AvifError::NoContent);
30         }
31         // Ensure that size does not exceed isize::MAX.
32         let _ = isize_from_usize(size)?;
33         Ok(Self {
34             ptr: unsafe { std::slice::from_raw_parts_mut(ptr, size) },
35         })
36     }
37 
slice_impl(&self) -> &[T]38     fn slice_impl(&self) -> &[T] {
39         // SAFETY: We only construct this with `ptr` which is valid at least as long as this struct
40         // is alive, and ro/mut borrows of the whole struct to access the inner slice, which makes
41         // our access appropriately exclusive.
42         unsafe { &(*self.ptr) }
43     }
44 
slice_impl_mut(&mut self) -> &mut [T]45     fn slice_impl_mut(&mut self) -> &mut [T] {
46         // SAFETY: We only construct this with `ptr` which is valid at least as long as this struct
47         // is alive, and ro/mut borrows of the whole struct to access the inner slice, which makes
48         // our access appropriately exclusive.
49         unsafe { &mut (*self.ptr) }
50     }
51 
slice(&self, range: Range<usize>) -> AvifResult<&[T]>52     pub fn slice(&self, range: Range<usize>) -> AvifResult<&[T]> {
53         let data = self.slice_impl();
54         check_slice_range(data.len(), &range)?;
55         Ok(&data[range])
56     }
57 
slice_mut(&mut self, range: Range<usize>) -> AvifResult<&mut [T]>58     pub fn slice_mut(&mut self, range: Range<usize>) -> AvifResult<&mut [T]> {
59         let data = self.slice_impl_mut();
60         check_slice_range(data.len(), &range)?;
61         Ok(&mut data[range])
62     }
63 
ptr(&self) -> *const T64     pub fn ptr(&self) -> *const T {
65         self.slice_impl().as_ptr()
66     }
67 
ptr_mut(&mut self) -> *mut T68     pub fn ptr_mut(&mut self) -> *mut T {
69         self.slice_impl_mut().as_mut_ptr()
70     }
71 
is_empty(&self) -> bool72     pub fn is_empty(&self) -> bool {
73         self.slice_impl().is_empty()
74     }
75 }
76 
77 #[derive(Clone, Debug)]
78 pub enum Pixels {
79     // Intended for holding data from underlying native libraries. Used for 8-bit images.
80     Pointer(PointerSlice<u8>),
81     // Intended for holding data from underlying native libraries. Used for 10-bit, 12-bit and
82     // 16-bit images.
83     Pointer16(PointerSlice<u16>),
84     // Used for 8-bit images.
85     Buffer(Vec<u8>),
86     // Used for 10-bit, 12-bit and 16-bit images.
87     Buffer16(Vec<u16>),
88 }
89 
90 impl Pixels {
from_raw_pointer( ptr: *mut u8, depth: u32, height: u32, mut row_bytes: u32, ) -> AvifResult<Self>91     pub fn from_raw_pointer(
92         ptr: *mut u8,
93         depth: u32,
94         height: u32,
95         mut row_bytes: u32,
96     ) -> AvifResult<Self> {
97         if depth > 8 {
98             row_bytes /= 2;
99         }
100         let size = usize_from_u32(checked_mul!(height, row_bytes)?)?;
101         if depth > 8 {
102             Ok(Pixels::Pointer16(unsafe {
103                 PointerSlice::create(ptr as *mut u16, size)?
104             }))
105         } else {
106             Ok(Pixels::Pointer(unsafe { PointerSlice::create(ptr, size)? }))
107         }
108     }
109 
size(&self) -> usize110     pub fn size(&self) -> usize {
111         match self {
112             Pixels::Pointer(_) => 0,
113             Pixels::Pointer16(_) => 0,
114             Pixels::Buffer(buffer) => buffer.len(),
115             Pixels::Buffer16(buffer) => buffer.len(),
116         }
117     }
118 
pixel_bit_size(&self) -> usize119     pub fn pixel_bit_size(&self) -> usize {
120         match self {
121             Pixels::Pointer(_) => 0,
122             Pixels::Pointer16(_) => 0,
123             Pixels::Buffer(_) => 8,
124             Pixels::Buffer16(_) => 16,
125         }
126     }
127 
has_data(&self) -> bool128     pub fn has_data(&self) -> bool {
129         match self {
130             Pixels::Pointer(ptr) => !ptr.is_empty(),
131             Pixels::Pointer16(ptr) => !ptr.is_empty(),
132             Pixels::Buffer(buffer) => !buffer.is_empty(),
133             Pixels::Buffer16(buffer) => !buffer.is_empty(),
134         }
135     }
136 
resize(&mut self, size: usize, default: u16) -> AvifResult<()>137     pub fn resize(&mut self, size: usize, default: u16) -> AvifResult<()> {
138         match self {
139             Pixels::Pointer(_) => return Err(AvifError::InvalidArgument),
140             Pixels::Pointer16(_) => return Err(AvifError::InvalidArgument),
141             Pixels::Buffer(buffer) => {
142                 if buffer.capacity() < size && buffer.try_reserve_exact(size).is_err() {
143                     return Err(AvifError::OutOfMemory);
144                 }
145                 buffer.resize(size, default as u8);
146             }
147             Pixels::Buffer16(buffer) => {
148                 if buffer.capacity() < size && buffer.try_reserve_exact(size).is_err() {
149                     return Err(AvifError::OutOfMemory);
150                 }
151                 buffer.resize(size, default);
152             }
153         }
154         Ok(())
155     }
156 
is_pointer(&self) -> bool157     pub fn is_pointer(&self) -> bool {
158         matches!(self, Pixels::Pointer(_) | Pixels::Pointer16(_))
159     }
160 
ptr(&self) -> *const u8161     pub fn ptr(&self) -> *const u8 {
162         match self {
163             Pixels::Pointer(ptr) => ptr.ptr(),
164             Pixels::Buffer(buffer) => buffer.as_ptr(),
165             _ => std::ptr::null_mut(),
166         }
167     }
168 
ptr16(&self) -> *const u16169     pub fn ptr16(&self) -> *const u16 {
170         match self {
171             Pixels::Pointer16(ptr) => ptr.ptr(),
172             Pixels::Buffer16(buffer) => buffer.as_ptr(),
173             _ => std::ptr::null_mut(),
174         }
175     }
176 
ptr_mut(&mut self) -> *mut u8177     pub fn ptr_mut(&mut self) -> *mut u8 {
178         match self {
179             Pixels::Pointer(ptr) => ptr.ptr_mut(),
180             Pixels::Buffer(buffer) => buffer.as_mut_ptr(),
181             _ => std::ptr::null_mut(),
182         }
183     }
184 
ptr16_mut(&mut self) -> *mut u16185     pub fn ptr16_mut(&mut self) -> *mut u16 {
186         match self {
187             Pixels::Pointer16(ptr) => ptr.ptr_mut(),
188             Pixels::Buffer16(buffer) => buffer.as_mut_ptr(),
189             _ => std::ptr::null_mut(),
190         }
191     }
192 
clone_pointer(&self) -> Option<Pixels>193     pub fn clone_pointer(&self) -> Option<Pixels> {
194         match self {
195             Pixels::Pointer(ptr) => Some(Pixels::Pointer(*ptr)),
196             Pixels::Pointer16(ptr) => Some(Pixels::Pointer16(*ptr)),
197             _ => None,
198         }
199     }
200 
slice(&self, offset: u32, size: u32) -> AvifResult<&[u8]>201     pub fn slice(&self, offset: u32, size: u32) -> AvifResult<&[u8]> {
202         let offset: usize = usize_from_u32(offset)?;
203         let size: usize = usize_from_u32(size)?;
204         match self {
205             Pixels::Pointer(ptr) => {
206                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
207                 ptr.slice(offset..end)
208             }
209             Pixels::Pointer16(_) => Err(AvifError::NoContent),
210             Pixels::Buffer(buffer) => {
211                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
212                 let range = offset..end;
213                 check_slice_range(buffer.len(), &range)?;
214                 Ok(&buffer[range])
215             }
216             Pixels::Buffer16(_) => Err(AvifError::NoContent),
217         }
218     }
219 
slice_mut(&mut self, offset: u32, size: u32) -> AvifResult<&mut [u8]>220     pub fn slice_mut(&mut self, offset: u32, size: u32) -> AvifResult<&mut [u8]> {
221         let offset: usize = usize_from_u32(offset)?;
222         let size: usize = usize_from_u32(size)?;
223         match self {
224             Pixels::Pointer(ptr) => {
225                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
226                 ptr.slice_mut(offset..end)
227             }
228             Pixels::Pointer16(_) => Err(AvifError::NoContent),
229             Pixels::Buffer(buffer) => {
230                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
231                 let range = offset..end;
232                 check_slice_range(buffer.len(), &range)?;
233                 Ok(&mut buffer[range])
234             }
235             Pixels::Buffer16(_) => Err(AvifError::NoContent),
236         }
237     }
238 
slice16(&self, offset: u32, size: u32) -> AvifResult<&[u16]>239     pub fn slice16(&self, offset: u32, size: u32) -> AvifResult<&[u16]> {
240         let offset: usize = usize_from_u32(offset)?;
241         let size: usize = usize_from_u32(size)?;
242         match self {
243             Pixels::Pointer(_) => Err(AvifError::NoContent),
244             Pixels::Pointer16(ptr) => {
245                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
246                 ptr.slice(offset..end)
247             }
248             Pixels::Buffer(_) => Err(AvifError::NoContent),
249             Pixels::Buffer16(buffer) => {
250                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
251                 let range = offset..end;
252                 check_slice_range(buffer.len(), &range)?;
253                 Ok(&buffer[range])
254             }
255         }
256     }
257 
slice16_mut(&mut self, offset: u32, size: u32) -> AvifResult<&mut [u16]>258     pub fn slice16_mut(&mut self, offset: u32, size: u32) -> AvifResult<&mut [u16]> {
259         let offset: usize = usize_from_u32(offset)?;
260         let size: usize = usize_from_u32(size)?;
261         match self {
262             Pixels::Pointer(_) => Err(AvifError::NoContent),
263             Pixels::Pointer16(ptr) => {
264                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
265                 ptr.slice_mut(offset..end)
266             }
267             Pixels::Buffer(_) => Err(AvifError::NoContent),
268             Pixels::Buffer16(buffer) => {
269                 let end = offset.checked_add(size).ok_or(AvifError::NoContent)?;
270                 let range = offset..end;
271                 check_slice_range(buffer.len(), &range)?;
272                 Ok(&mut buffer[range])
273             }
274         }
275     }
276 }
277