add RgbaBitmap blended drawing primitives

This commit is contained in:
Gered 2023-03-26 16:36:53 -04:00
parent 5c2571755a
commit f233f810e6
3 changed files with 87 additions and 0 deletions

View file

@ -5,6 +5,7 @@ use crate::graphics::color::to_rgb32;
use crate::graphics::palette::Palette;
pub mod blit;
pub mod primitives;
pub type RgbaBitmap = Bitmap<u32>;

View file

@ -0,0 +1,85 @@
use crate::graphics::bitmap::rgb::RgbaBitmap;
use crate::graphics::color::BlendFunction;
impl RgbaBitmap {
/// Sets the pixel at the given coordinates using a blended color via the specified blend function
/// If the coordinates lie outside of the bitmaps clipping region, no pixels will be changed.
#[inline]
pub fn set_blended_pixel(&mut self, x: i32, y: i32, color: u32, blend: BlendFunction) {
self.set_custom_pixel(
x, y,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
/// Sets the pixel at the given coordinates using a blended color via the specified blend function,
/// The coordinates are not checked for validity, so it is up to you to ensure they lie within the
/// bounds of the bitmap.
#[inline]
pub unsafe fn set_blended_pixel_unchecked(&mut self, x: i32, y: i32, color: u32, blend: BlendFunction) {
self.set_custom_pixel_unchecked(
x, y,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
/// Draws a line from x1,y1 to x2,y2 by blending the drawn pixels using the given blend function.
pub fn blended_line(&mut self, x1: i32, y1: i32, x2: i32, y2: i32, color: u32, blend: BlendFunction) {
self.line_custom(
x1, y1, x2, y2,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
/// Draws a horizontal line from x1,y to x2,y by blending the drawn pixels using the given
/// blend function.
pub fn blended_horiz_line(&mut self, x1: i32, x2: i32, y: i32, color: u32, blend: BlendFunction) {
self.horiz_line_custom(
x1, x2, y,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
/// Draws a vertical line from x,y1 to x,y2 by blending the drawn pixels using the given blend
/// function.
pub fn blended_vert_line(&mut self, x: i32, y1: i32, y2: i32, color: u32, blend: BlendFunction) {
self.vert_line_custom(
x, y1, y2,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
/// Draws an empty box (rectangle) using the points x1,y1 and x2,y2 to form the box to be
/// drawn, assuming they are specifying the top-left and bottom-right corners respectively.
/// The box is drawn by blending the drawn pixels using the given blend function.
pub fn blended_rect(&mut self, x1: i32, y1: i32, x2: i32, y2: i32, color: u32, blend: BlendFunction) {
self.rect_custom(
x1, y1, x2, y2,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
/// Draws a filled box (rectangle) using the points x1,y1 and x2,y2 to form the box to be
/// drawn, assuming they are specifying the top-left and bottom-right corners respectively. The
/// filled box is draw by blending the drawn pixels using the given blend function.
pub fn blended_filled_rect(&mut self, x1: i32, y1: i32, x2: i32, y2: i32, color: u32, blend: BlendFunction) {
self.filled_rect_custom(
x1, y1, x2, y2,
|dest_color| {
blend.blend(color, dest_color)
}
);
}
}

View file

@ -17,6 +17,7 @@ pub use crate::graphics::{
rgb::{
*,
blit::*,
primitives::*,
},
},
bitmapatlas::*,