@@ -242,14 +242,35 @@ impl<'a> BitMapBackend<'a> {
242242 . for_each ( |e| * e = r) ;
243243 }
244244 } else {
245- for y in y0..=y1 {
246- let start = ( y * w as i32 + x0) as usize ;
247- let count = ( x1 - x0 + 1 ) as usize ;
248- let mut iter = dst[ ( start * 3 ) ..( ( start + count) * 3 ) ] . iter_mut ( ) ;
249- for _ in 0 ..( x1 - x0 + 1 ) {
250- * iter. next ( ) . unwrap ( ) = r;
251- * iter. next ( ) . unwrap ( ) = g;
252- * iter. next ( ) . unwrap ( ) = b;
245+ let count = ( x1 - x0 + 1 ) as usize ;
246+ if count < 8 {
247+ for y in y0..=y1 {
248+ let start = ( y * w as i32 + x0) as usize ;
249+ let mut iter = dst[ ( start * 3 ) ..( ( start + count) * 3 ) ] . iter_mut ( ) ;
250+ for _ in 0 ..( x1 - x0 + 1 ) {
251+ * iter. next ( ) . unwrap ( ) = r;
252+ * iter. next ( ) . unwrap ( ) = g;
253+ * iter. next ( ) . unwrap ( ) = b;
254+ }
255+ }
256+ } else {
257+ for y in y0..=y1 {
258+ let start = ( y * w as i32 + x0) as usize ;
259+ let start_ptr = & mut dst[ start * 3 ] as * mut u8 as * mut ( u8 , u8 , u8 , u8 , u8 , u8 ) ;
260+ let slice =
261+ unsafe { std:: slice:: from_raw_parts_mut ( start_ptr, ( count - 1 ) / 2 ) } ;
262+ for p in slice. iter_mut ( ) {
263+ unsafe {
264+ let ptr = p as * mut ( u8 , u8 , u8 , u8 , u8 , u8 ) as * mut u64 ;
265+ * ptr = std:: mem:: transmute ( [ r, g, b, r, g, b, 0 , 0 ] ) ;
266+ }
267+ }
268+
269+ for idx in ( slice. len ( ) * 2 ) ..count {
270+ dst[ start * 3 + idx * 3 ] = r;
271+ dst[ start * 3 + idx * 3 + 1 ] = g;
272+ dst[ start * 3 + idx * 3 + 2 ] = b;
273+ }
253274 }
254275 }
255276 }
@@ -318,7 +339,21 @@ impl<'a> DrawingBackend for BitMapBackend<'a> {
318339
319340 if from. 0 == to. 0 || from. 1 == to. 1 {
320341 if alpha >= 1.0 {
321- self . fill_rect_fast ( from, to, r, g, b) ;
342+ if from. 1 == to. 1 {
343+ self . fill_rect_fast ( from, to, r, g, b) ;
344+ } else {
345+ let w = self . get_size ( ) . 0 as i32 ;
346+ let dst = self . get_raw_pixel_buffer ( ) ;
347+ let ( mut y0, mut y1) = ( from. 1 , to. 1 ) ;
348+ if y0 > y1 {
349+ std:: mem:: swap ( & mut y0, & mut y1) ;
350+ }
351+ for y in y0..=y1 {
352+ dst[ ( y * w + from. 0 ) as usize * 3 ] = r;
353+ dst[ ( y * w + from. 0 ) as usize * 3 + 1 ] = g;
354+ dst[ ( y * w + from. 0 ) as usize * 3 + 2 ] = b;
355+ }
356+ }
322357 } else {
323358 self . blend_rect_fast ( from, to, r, g, b, alpha) ;
324359 }
0 commit comments