|
64 | 64 | /// format => unimplemented!("unknown default pixel format: {format:?}"), |
65 | 65 | /// } |
66 | 66 | /// ``` |
| 67 | +/// |
| 68 | +/// Premultiply a pixel. Useful when rendering to buffers with [`AlphaMode::Premultiplied`]. |
| 69 | +/// |
| 70 | +/// [`AlphaMode::Premultiplied`]: crate::AlphaMode::Premultiplied |
| 71 | +/// |
| 72 | +/// ``` |
| 73 | +/// use softbuffer::Pixel; |
| 74 | +/// |
| 75 | +/// #[inline] |
| 76 | +/// fn premultiply(val: u8, alpha: u8) -> u8 { |
| 77 | +/// ((val as u16 * alpha as u16) / 0xff) as u8 |
| 78 | +/// } |
| 79 | +/// |
| 80 | +/// let pixel = Pixel::new_rgba(0, 128, 255, 50); |
| 81 | +/// let premultiplied_pixe = Pixel { |
| 82 | +/// r: premultiply(pixel.r, pixel.a), |
| 83 | +/// g: premultiply(pixel.g, pixel.a), |
| 84 | +/// b: premultiply(pixel.b, pixel.a), |
| 85 | +/// a: pixel.a, |
| 86 | +/// }; |
| 87 | +/// assert_eq!(premultiplied_pixe, Pixel::new_rgba(0, 25, 50, 50)); |
| 88 | +/// ``` |
| 89 | +/// |
| 90 | +/// Un-premultiply a pixel. |
| 91 | +/// |
| 92 | +/// ``` |
| 93 | +/// use softbuffer::Pixel; |
| 94 | +/// |
| 95 | +/// #[inline] |
| 96 | +/// fn unpremultiply(val: u8, alpha: u8) -> u8 { |
| 97 | +/// // Avoid division by 0. |
| 98 | +/// if alpha == 0 { |
| 99 | +/// return 0; // Or 255 depending on how you want to handle transparent pixels. |
| 100 | +/// } |
| 101 | +/// |
| 102 | +/// let x = (val as u16 * u8::MAX as u16) + (alpha as u16 / 2); // Rounding. |
| 103 | +/// |
| 104 | +/// // NOTE: Would possibly be faster with a lookup table for `alpha` reciprocals. |
| 105 | +/// (x / alpha as u16).min(u8::MAX as u16) as u8 |
| 106 | +/// } |
| 107 | +/// |
| 108 | +/// let pixel = Pixel::new_rgba(25, 50, 100, 50); |
| 109 | +/// let unpremultiplied_pixe = Pixel { |
| 110 | +/// r: unpremultiply(pixel.r, pixel.a), |
| 111 | +/// g: unpremultiply(pixel.g, pixel.a), |
| 112 | +/// b: unpremultiply(pixel.b, pixel.a), |
| 113 | +/// a: pixel.a, |
| 114 | +/// }; |
| 115 | +/// assert_eq!(unpremultiplied_pixe, Pixel::new_rgba(128, 255, 255, 50)); |
| 116 | +/// ``` |
67 | 117 | #[repr(C)] |
68 | 118 | #[repr(align(4))] // Help the compiler to see that this is a u32 |
69 | 119 | #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default)] |
|
0 commit comments