@@ -4,9 +4,9 @@ use std::marker::PhantomData;
4
4
5
5
#[ cfg( all( not( target_arch = "wasm32" ) , feature = "image" ) ) ]
6
6
mod image_encoding_support {
7
- pub ( super ) use image:: { ImageBuffer , ImageError , Rgb } ;
7
+ pub ( super ) use image:: { ImageBuffer , ImageError , Pixel } ;
8
8
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 ] > ;
10
10
}
11
11
12
12
#[ cfg( all( not( target_arch = "wasm32" ) , feature = "image" ) ) ]
@@ -111,7 +111,8 @@ impl<'a> Buffer<'a> {
111
111
}
112
112
113
113
/// 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 > ,
115
116
/// The path to the image
116
117
#[ allow( dead_code) ]
117
118
target : Target < ' a > ,
@@ -123,11 +124,12 @@ pub struct BitMapBackend<'a> {
123
124
saved : bool ,
124
125
}
125
126
126
- impl < ' a > BitMapBackend < ' a > {
127
+ impl < ' a , P : ' static + Pixel < Subpixel = u8 > > BitMapBackend < ' a , P > {
127
128
/// Create a new bitmap backend
128
129
#[ cfg( all( not( target_arch = "wasm32" ) , feature = "image" ) ) ]
129
130
pub fn new < T : AsRef < Path > + ?Sized > ( path : & ' a T , ( w, h) : ( u32 , u32 ) ) -> Self {
130
131
Self {
132
+ _pix : PhantomData ,
131
133
target : Target :: File ( path. as_ref ( ) ) ,
132
134
size : ( w, h) ,
133
135
buffer : Buffer :: Owned ( vec ! [ 0 ; ( 3 * w * h) as usize ] ) ,
@@ -151,6 +153,7 @@ impl<'a> BitMapBackend<'a> {
151
153
frame_delay : u32 ,
152
154
) -> Result < Self , BitMapBackendError > {
153
155
Ok ( Self {
156
+ _pix : PhantomData ,
154
157
target : Target :: Gif ( Box :: new ( gif_support:: GifFile :: new (
155
158
path,
156
159
( w, h) ,
@@ -170,7 +173,7 @@ impl<'a> BitMapBackend<'a> {
170
173
/// - `buf`: The buffer to operate
171
174
/// - `dimension`: The size of the image in pixels
172
175
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 ( ) {
174
177
// TODO: This doesn't deserve a panic.
175
178
panic ! (
176
179
"Wrong image size: H = {}, W = {}, BufSize = {}" ,
@@ -181,6 +184,7 @@ impl<'a> BitMapBackend<'a> {
181
184
}
182
185
183
186
Self {
187
+ _pix : PhantomData ,
184
188
target : Target :: Buffer ( PhantomData ) ,
185
189
size : ( w, h) ,
186
190
buffer : Buffer :: Borrowed ( buf) ,
@@ -194,7 +198,7 @@ impl<'a> BitMapBackend<'a> {
194
198
195
199
/// Split a bitmap backend vertically into several sub drawing area which allows
196
200
/// 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 > > {
198
202
let ( w, h) = self . get_size ( ) ;
199
203
let buf = self . get_raw_pixel_buffer ( ) ;
200
204
@@ -358,7 +362,7 @@ impl<'a> BitMapBackend<'a> {
358
362
}
359
363
}
360
364
361
- impl < ' a > DrawingBackend for BitMapBackend < ' a > {
365
+ impl < ' a , P : ' static + Pixel < Subpixel = u8 > > DrawingBackend for BitMapBackend < ' a , P > {
362
366
type ErrorType = BitMapBackendError ;
363
367
364
368
fn get_size ( & self ) -> ( u32 , u32 ) {
@@ -380,7 +384,7 @@ impl<'a> DrawingBackend for BitMapBackend<'a> {
380
384
let ( w, h) = self . get_size ( ) ;
381
385
match & mut self . target {
382
386
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 ( ) ) {
384
388
img. save ( & path) . map_err ( |x| {
385
389
DrawingErrorKind :: DrawingError ( BitMapBackendError :: IOError ( x) )
386
390
} ) ?;
@@ -552,7 +556,7 @@ impl<'a> DrawingBackend for BitMapBackend<'a> {
552
556
}
553
557
}
554
558
555
- impl Drop for BitMapBackend < ' _ > {
559
+ impl < P : ' static + Pixel < Subpixel = u8 > > Drop for BitMapBackend < ' _ , P > {
556
560
fn drop ( & mut self ) {
557
561
if !self . saved {
558
562
self . present ( ) . expect ( "Unable to save the bitmap" ) ;
@@ -567,7 +571,7 @@ fn test_bitmap_backend() {
567
571
let mut buffer = vec ! [ 0 ; 10 * 10 * 3 ] ;
568
572
569
573
{
570
- let back = BitMapBackend :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
574
+ let back = BitMapBackend :: < image :: Rgb < u8 > > :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
571
575
572
576
let area = back. into_drawing_area ( ) ;
573
577
area. fill ( & WHITE ) . unwrap ( ) ;
@@ -595,7 +599,7 @@ fn test_bitmap_backend_fill_half() {
595
599
let mut buffer = vec ! [ 0 ; 10 * 10 * 3 ] ;
596
600
597
601
{
598
- let back = BitMapBackend :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
602
+ let back = BitMapBackend :: < image :: Rgb < u8 > > :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
599
603
600
604
let area = back. into_drawing_area ( ) ;
601
605
area. draw ( & Rectangle :: new ( [ ( 0 , 0 ) , ( 5 , 10 ) ] , RED . filled ( ) ) )
@@ -616,7 +620,7 @@ fn test_bitmap_backend_fill_half() {
616
620
let mut buffer = vec ! [ 0 ; 10 * 10 * 3 ] ;
617
621
618
622
{
619
- let back = BitMapBackend :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
623
+ let back = BitMapBackend :: < image :: Rgb < u8 > > :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
620
624
621
625
let area = back. into_drawing_area ( ) ;
622
626
area. draw ( & Rectangle :: new ( [ ( 0 , 0 ) , ( 10 , 5 ) ] , RED . filled ( ) ) )
@@ -642,7 +646,7 @@ fn test_bitmap_backend_blend() {
642
646
let mut buffer = vec ! [ 255 ; 10 * 10 * 3 ] ;
643
647
644
648
{
645
- let back = BitMapBackend :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
649
+ let back = BitMapBackend :: < image :: Rgb < u8 > > :: with_buffer ( & mut buffer, ( 10 , 10 ) ) ;
646
650
647
651
let area = back. into_drawing_area ( ) ;
648
652
area. draw ( & Rectangle :: new (
@@ -674,7 +678,7 @@ fn test_bitmap_backend_split_and_fill() {
674
678
let mut buffer = vec ! [ 255 ; 10 * 10 * 3 ] ;
675
679
676
680
{
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 ) ) ;
678
682
679
683
for ( sub_backend, color) in back. split ( & [ 5 ] ) . into_iter ( ) . zip ( [ & RED , & GREEN ] . iter ( ) ) {
680
684
sub_backend. into_drawing_area ( ) . fill ( * color) . unwrap ( ) ;
@@ -698,7 +702,7 @@ fn test_draw_rect_out_of_range() {
698
702
let mut buffer = vec ! [ 0 ; 1099 * 1000 * 3 ] ;
699
703
700
704
{
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 ) ) ;
702
706
703
707
back. draw_line ( ( 1100 , 0 ) , ( 1100 , 999 ) , & RED . to_rgba ( ) )
704
708
. unwrap ( ) ;
@@ -724,7 +728,7 @@ fn test_draw_line_out_of_range() {
724
728
let mut buffer = vec ! [ 0 ; 1000 * 1000 * 3 ] ;
725
729
726
730
{
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 ) ) ;
728
732
729
733
back. draw_line ( ( -1000 , -1000 ) , ( 2000 , 2000 ) , & WHITE . to_rgba ( ) )
730
734
. unwrap ( ) ;
0 commit comments