@@ -242,14 +242,35 @@ impl<'a> BitMapBackend<'a> {
242
242
. for_each ( |e| * e = r) ;
243
243
}
244
244
} 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
+ }
253
274
}
254
275
}
255
276
}
@@ -318,7 +339,21 @@ impl<'a> DrawingBackend for BitMapBackend<'a> {
318
339
319
340
if from. 0 == to. 0 || from. 1 == to. 1 {
320
341
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
+ }
322
357
} else {
323
358
self . blend_rect_fast ( from, to, r, g, b, alpha) ;
324
359
}
0 commit comments