Skip to content

Commit 55a83d9

Browse files
committed
Add examples of [un-]premultiplying a pixel
1 parent 9d2e23d commit 55a83d9

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

src/pixel.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,56 @@
6464
/// format => unimplemented!("unknown default pixel format: {format:?}"),
6565
/// }
6666
/// ```
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+
/// ```
67117
#[repr(C)]
68118
#[repr(align(4))] // Help the compiler to see that this is a u32
69119
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default)]

0 commit comments

Comments
 (0)