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