Skip to content

Commit 52f3da4

Browse files
committed
generic pixel type for bitmapbackend
1 parent 603b7f4 commit 52f3da4

File tree

4 files changed

+34
-30
lines changed

4 files changed

+34
-30
lines changed

benches/benches/parallel.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fn draw_func_1x1_seq(c: &mut Criterion) {
3737
let mut buffer = vec![0; (W * H * 3) as usize];
3838
c.bench_function("parallel::draw_func_1x1_seq", |b| {
3939
b.iter(|| {
40-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
40+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
4141
root.fill(&WHITE).unwrap();
4242
draw_plot(&root, 2.0);
4343
})
@@ -48,7 +48,7 @@ fn draw_func_4x4_seq(c: &mut Criterion) {
4848
let mut buffer = vec![0; (W * H * 3) as usize];
4949
c.bench_function("parallel::draw_func_4x4_seq", |b| {
5050
b.iter(|| {
51-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
51+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
5252
let areas = root.split_evenly((4, 4));
5353
areas.iter().for_each(|area| draw_plot(&area, 2.0));
5454
})
@@ -59,7 +59,7 @@ fn draw_func_4x4_parallel_and_blit(c: &mut Criterion) {
5959
let mut buffer = vec![0; (W * H * 3) as usize];
6060
c.bench_function("parallel::draw_func_4x4_parallel_and_blit", |b| {
6161
b.iter(|| {
62-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
62+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
6363
let areas = root.split_evenly((4, 4));
6464
let mut elements: Vec<_> = areas
6565
.iter()
@@ -83,7 +83,7 @@ fn draw_func_2x1_parallel_and_blit(c: &mut Criterion) {
8383
let mut buffer = vec![0; (W * H * 3) as usize];
8484
c.bench_function("parallel::draw_func_2x1_parallel_and_blit", |b| {
8585
b.iter(|| {
86-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
86+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
8787
let areas = root.split_evenly((2, 1));
8888
let mut elements: Vec<_> = areas
8989
.iter()
@@ -107,7 +107,7 @@ fn draw_func_2x1_inplace_parallel(c: &mut Criterion) {
107107
let mut buffer = vec![0u8; (W * H * 3) as usize];
108108
c.bench_function("parallel::draw_func_2x1_inplace", |b| {
109109
b.iter(|| {
110-
let mut back = BitMapBackend::with_buffer(&mut buffer, (W, H));
110+
let mut back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H));
111111
back.split(&[H / 2])
112112
.into_par_iter()
113113
.for_each(|b| draw_plot(&b.into_drawing_area(), 2.0));
@@ -119,7 +119,7 @@ fn draw_func_2x1_seq(c: &mut Criterion) {
119119
let mut buffer = vec![0u8; (W * H * 3) as usize];
120120
c.bench_function("parallel::draw_func_2x1_seq", |b| {
121121
b.iter(|| {
122-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
122+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
123123
root.split_evenly((2, 1))
124124
.iter_mut()
125125
.for_each(|area| draw_plot(area, 2.0));

benches/benches/rasterizer.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ fn draw_pixel(c: &mut Criterion) {
99

1010
c.bench_function("rasterizer::draw_pixel", |b| {
1111
b.iter(|| {
12-
let mut root = BitMapBackend::with_buffer(&mut buffer, (W, H));
12+
let mut root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H));
1313
for x in 0..W / 10 {
1414
for y in 0..H / 10 {
1515
root.draw_pixel((x as i32, y as i32), &RGBColor(255, 0, 234).to_rgba())
@@ -25,7 +25,7 @@ fn draw_line(c: &mut Criterion) {
2525

2626
c.bench_function("rasterizer::draw_line", |b| {
2727
b.iter(|| {
28-
let mut root = BitMapBackend::with_buffer(&mut buffer, (W, H));
28+
let mut root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H));
2929
for y in 0..10 {
3030
root.draw_line(
3131
(0, 0),
@@ -43,7 +43,7 @@ fn fill_background(c: &mut Criterion) {
4343

4444
c.bench_function("rasterizer::fill_background", |b| {
4545
b.iter(|| {
46-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
46+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
4747
root.fill(&WHITE).unwrap();
4848
})
4949
});
@@ -54,7 +54,7 @@ fn fill_circle(c: &mut Criterion) {
5454

5555
c.bench_function("rasterizer::fill_circle", |b| {
5656
b.iter(|| {
57-
let mut root = BitMapBackend::with_buffer(&mut buffer, (W, H));
57+
let mut root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H));
5858
root.draw_circle((W as i32 / 2, H as i32 / 2), W / 2, &WHITE.to_rgba(), true)
5959
.unwrap();
6060
})
@@ -66,7 +66,7 @@ fn fill_background_red(c: &mut Criterion) {
6666

6767
c.bench_function("rasterizer::fill_background_red", |b| {
6868
b.iter(|| {
69-
let root = BitMapBackend::with_buffer(&mut buffer, (W, H)).into_drawing_area();
69+
let root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H)).into_drawing_area();
7070
root.fill(&RED).unwrap();
7171
})
7272
});
@@ -87,7 +87,7 @@ fn fill_hexagon(c: &mut Criterion) {
8787

8888
c.bench_function("rasterizer::fill_hexagon", |b| {
8989
b.iter(|| {
90-
let mut root = BitMapBackend::with_buffer(&mut buffer, (W, H));
90+
let mut root = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (W, H));
9191
root.fill_polygon(vert.clone(), &RED).unwrap();
9292
})
9393
});

src/drawing/backend_impl/bitmap.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use std::marker::PhantomData;
44

55
#[cfg(all(not(target_arch = "wasm32"), feature = "image"))]
66
mod image_encoding_support {
7-
pub(super) use image::{ImageBuffer, ImageError, Rgb};
7+
pub(super) use image::{ImageBuffer, ImageError, Pixel};
88
pub(super) use std::path::Path;
9-
pub(super) type BorrowedImage<'a> = ImageBuffer<Rgb<u8>, &'a mut [u8]>;
9+
pub(super) type BorrowedImage<'a, P> = ImageBuffer<P, &'a mut [u8]>;
1010
}
1111

1212
#[cfg(all(not(target_arch = "wasm32"), feature = "image"))]
@@ -111,7 +111,8 @@ impl<'a> Buffer<'a> {
111111
}
112112

113113
/// The backend that drawing a bitmap
114-
pub struct BitMapBackend<'a> {
114+
pub struct BitMapBackend<'a, P: 'static + Pixel<Subpixel=u8>> {
115+
_pix: PhantomData<P>,
115116
/// The path to the image
116117
#[allow(dead_code)]
117118
target: Target<'a>,
@@ -123,11 +124,12 @@ pub struct BitMapBackend<'a> {
123124
saved: bool,
124125
}
125126

126-
impl<'a> BitMapBackend<'a> {
127+
impl<'a, P: 'static + Pixel<Subpixel=u8>> BitMapBackend<'a, P> {
127128
/// Create a new bitmap backend
128129
#[cfg(all(not(target_arch = "wasm32"), feature = "image"))]
129130
pub fn new<T: AsRef<Path> + ?Sized>(path: &'a T, (w, h): (u32, u32)) -> Self {
130131
Self {
132+
_pix: PhantomData,
131133
target: Target::File(path.as_ref()),
132134
size: (w, h),
133135
buffer: Buffer::Owned(vec![0; (3 * w * h) as usize]),
@@ -151,6 +153,7 @@ impl<'a> BitMapBackend<'a> {
151153
frame_delay: u32,
152154
) -> Result<Self, BitMapBackendError> {
153155
Ok(Self {
156+
_pix: PhantomData,
154157
target: Target::Gif(Box::new(gif_support::GifFile::new(
155158
path,
156159
(w, h),
@@ -170,7 +173,7 @@ impl<'a> BitMapBackend<'a> {
170173
/// - `buf`: The buffer to operate
171174
/// - `dimension`: The size of the image in pixels
172175
pub fn with_buffer(buf: &'a mut [u8], (w, h): (u32, u32)) -> Self {
173-
if (w * h * 3) as usize > buf.len() {
176+
if (w * h * P::CHANNEL_COUNT as u32) as usize > buf.len() {
174177
// TODO: This doesn't deserve a panic.
175178
panic!(
176179
"Wrong image size: H = {}, W = {}, BufSize = {}",
@@ -181,6 +184,7 @@ impl<'a> BitMapBackend<'a> {
181184
}
182185

183186
Self {
187+
_pix: PhantomData,
184188
target: Target::Buffer(PhantomData),
185189
size: (w, h),
186190
buffer: Buffer::Borrowed(buf),
@@ -194,7 +198,7 @@ impl<'a> BitMapBackend<'a> {
194198

195199
/// Split a bitmap backend vertically into several sub drawing area which allows
196200
/// multi-threading rendering.
197-
pub fn split(&mut self, area_size: &[u32]) -> Vec<BitMapBackend> {
201+
pub fn split(&mut self, area_size: &[u32]) -> Vec<BitMapBackend<P>> {
198202
let (w, h) = self.get_size();
199203
let buf = self.get_raw_pixel_buffer();
200204

@@ -358,7 +362,7 @@ impl<'a> BitMapBackend<'a> {
358362
}
359363
}
360364

361-
impl<'a> DrawingBackend for BitMapBackend<'a> {
365+
impl<'a, P: 'static + Pixel<Subpixel=u8>> DrawingBackend for BitMapBackend<'a, P> {
362366
type ErrorType = BitMapBackendError;
363367

364368
fn get_size(&self) -> (u32, u32) {
@@ -380,7 +384,7 @@ impl<'a> DrawingBackend for BitMapBackend<'a> {
380384
let (w, h) = self.get_size();
381385
match &mut self.target {
382386
Target::File(path) => {
383-
if let Some(img) = BorrowedImage::from_raw(w, h, self.buffer.borrow_buffer()) {
387+
if let Some(img) = BorrowedImage::<P>::from_raw(w, h, self.buffer.borrow_buffer()) {
384388
img.save(&path).map_err(|x| {
385389
DrawingErrorKind::DrawingError(BitMapBackendError::IOError(x))
386390
})?;
@@ -552,7 +556,7 @@ impl<'a> DrawingBackend for BitMapBackend<'a> {
552556
}
553557
}
554558

555-
impl Drop for BitMapBackend<'_> {
559+
impl<P: 'static + Pixel<Subpixel=u8>> Drop for BitMapBackend<'_, P> {
556560
fn drop(&mut self) {
557561
if !self.saved {
558562
self.present().expect("Unable to save the bitmap");
@@ -567,7 +571,7 @@ fn test_bitmap_backend() {
567571
let mut buffer = vec![0; 10 * 10 * 3];
568572

569573
{
570-
let back = BitMapBackend::with_buffer(&mut buffer, (10, 10));
574+
let back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (10, 10));
571575

572576
let area = back.into_drawing_area();
573577
area.fill(&WHITE).unwrap();
@@ -595,7 +599,7 @@ fn test_bitmap_backend_fill_half() {
595599
let mut buffer = vec![0; 10 * 10 * 3];
596600

597601
{
598-
let back = BitMapBackend::with_buffer(&mut buffer, (10, 10));
602+
let back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (10, 10));
599603

600604
let area = back.into_drawing_area();
601605
area.draw(&Rectangle::new([(0, 0), (5, 10)], RED.filled()))
@@ -616,7 +620,7 @@ fn test_bitmap_backend_fill_half() {
616620
let mut buffer = vec![0; 10 * 10 * 3];
617621

618622
{
619-
let back = BitMapBackend::with_buffer(&mut buffer, (10, 10));
623+
let back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (10, 10));
620624

621625
let area = back.into_drawing_area();
622626
area.draw(&Rectangle::new([(0, 0), (10, 5)], RED.filled()))
@@ -642,7 +646,7 @@ fn test_bitmap_backend_blend() {
642646
let mut buffer = vec![255; 10 * 10 * 3];
643647

644648
{
645-
let back = BitMapBackend::with_buffer(&mut buffer, (10, 10));
649+
let back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (10, 10));
646650

647651
let area = back.into_drawing_area();
648652
area.draw(&Rectangle::new(
@@ -674,7 +678,7 @@ fn test_bitmap_backend_split_and_fill() {
674678
let mut buffer = vec![255; 10 * 10 * 3];
675679

676680
{
677-
let mut back = BitMapBackend::with_buffer(&mut buffer, (10, 10));
681+
let mut back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (10, 10));
678682

679683
for (sub_backend, color) in back.split(&[5]).into_iter().zip([&RED, &GREEN].iter()) {
680684
sub_backend.into_drawing_area().fill(*color).unwrap();
@@ -698,7 +702,7 @@ fn test_draw_rect_out_of_range() {
698702
let mut buffer = vec![0; 1099 * 1000 * 3];
699703

700704
{
701-
let mut back = BitMapBackend::with_buffer(&mut buffer, (1000, 1000));
705+
let mut back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (1000, 1000));
702706

703707
back.draw_line((1100, 0), (1100, 999), &RED.to_rgba())
704708
.unwrap();
@@ -724,7 +728,7 @@ fn test_draw_line_out_of_range() {
724728
let mut buffer = vec![0; 1000 * 1000 * 3];
725729

726730
{
727-
let mut back = BitMapBackend::with_buffer(&mut buffer, (1000, 1000));
731+
let mut back = BitMapBackend::<image::Rgb<u8>>::with_buffer(&mut buffer, (1000, 1000));
728732

729733
back.draw_line((-1000, -1000), (2000, 2000), &WHITE.to_rgba())
730734
.unwrap();

src/element/image.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ impl<'a, Coord> BitMapElement<'a, Coord> {
4848

4949
/// Make the bitmap element as a bitmap backend, so that we can use
5050
/// plotters drawing functionality on the bitmap element
51-
pub fn as_bitmap_backend(&mut self) -> BitMapBackend {
52-
BitMapBackend::with_buffer(self.image.to_mut(), self.size)
51+
pub fn as_bitmap_backend<P: image::Pixel<Subpixel=u8>>(&mut self) -> BitMapBackend<P> {
52+
BitMapBackend::<P>::with_buffer(self.image.to_mut(), self.size)
5353
}
5454
}
5555

0 commit comments

Comments
 (0)