@@ -188,7 +188,7 @@ static void fast_imageblit(const struct fb_image *image, struct fb_info *p,
188
188
{
189
189
u32 fgx = fgcolor , bgx = bgcolor , bpp = p -> var .bits_per_pixel ;
190
190
u32 ppw = 32 /bpp , spitch = (image -> width + 7 )/8 ;
191
- u32 bit_mask , eorx ;
191
+ u32 bit_mask , eorx , shift ;
192
192
const char * s = image -> data , * src ;
193
193
u32 * dst ;
194
194
const u32 * tab ;
@@ -229,25 +229,31 @@ static void fast_imageblit(const struct fb_image *image, struct fb_info *p,
229
229
230
230
for (i = image -> height ; i -- ; ) {
231
231
dst = dst1 ;
232
+ shift = 8 ;
232
233
src = s ;
233
234
235
+ /*
236
+ * Manually unroll the per-line copying loop for better
237
+ * performance. This works until we processed the last
238
+ * completely filled source byte (inclusive).
239
+ */
234
240
switch (ppw ) {
235
241
case 4 : /* 8 bpp */
236
- for (j = k ; j ; j -= 2 , ++ src ) {
242
+ for (j = k ; j >= 2 ; j -= 2 , ++ src ) {
237
243
* dst ++ = colortab [(* src >> 4 ) & bit_mask ];
238
244
* dst ++ = colortab [(* src >> 0 ) & bit_mask ];
239
245
}
240
246
break ;
241
247
case 2 : /* 16 bpp */
242
- for (j = k ; j ; j -= 4 , ++ src ) {
248
+ for (j = k ; j >= 4 ; j -= 4 , ++ src ) {
243
249
* dst ++ = colortab [(* src >> 6 ) & bit_mask ];
244
250
* dst ++ = colortab [(* src >> 4 ) & bit_mask ];
245
251
* dst ++ = colortab [(* src >> 2 ) & bit_mask ];
246
252
* dst ++ = colortab [(* src >> 0 ) & bit_mask ];
247
253
}
248
254
break ;
249
255
case 1 : /* 32 bpp */
250
- for (j = k ; j ; j -= 8 , ++ src ) {
256
+ for (j = k ; j >= 8 ; j -= 8 , ++ src ) {
251
257
* dst ++ = colortab [(* src >> 7 ) & bit_mask ];
252
258
* dst ++ = colortab [(* src >> 6 ) & bit_mask ];
253
259
* dst ++ = colortab [(* src >> 5 ) & bit_mask ];
@@ -259,6 +265,21 @@ static void fast_imageblit(const struct fb_image *image, struct fb_info *p,
259
265
}
260
266
break ;
261
267
}
268
+
269
+ /*
270
+ * For image widths that are not a multiple of 8, there
271
+ * are trailing pixels left on the current line. Print
272
+ * them as well.
273
+ */
274
+ for (; j -- ; ) {
275
+ shift -= ppw ;
276
+ * dst ++ = colortab [(* src >> shift ) & bit_mask ];
277
+ if (!shift ) {
278
+ shift = 8 ;
279
+ ++ src ;
280
+ }
281
+ }
282
+
262
283
dst1 += p -> fix .line_length ;
263
284
s += spitch ;
264
285
}
0 commit comments