Andrew Huang
对于直接使用frame buffer进行绘点的系统,SDL在直接输出点前使用使用一个转换函数。blitFunc,这个函数是在static void FB_DirectUpdate(_THIS, int numrects, SDL_Rect *rects) 中调用的。调用语句如下.
- blitFunc((Uint8 *) src_start,
- shadow_right_delta,
- shadow_down_delta,
- (Uint8 *) dst_start,
- physlinebytes,
- scr_x2 - scr_x1,
- scr_y2 - scr_y1);
如果对输出结果不旋转,则使用FB_blit16这个函数来输出的,
if (vinfo.bits_per_pixel == 16) {
blitFunc = (rotate == FBCON_ROTATE_NONE ||
rotate == FBCON_ROTATE_UD) ?
FB_blit16 : FB_blit16blocked;
而FB_blit16的内容如下:
- static void FB_blit16(Uint8 *byte_src_pos, int src_right_delta, int src_down_delta,
- Uint8 *byte_dst_pos, int dst_linebytes, int width, int height)
- {
- int w;
- #ifdef I80_FB_PATCH
- int is_odd =1;
- #endif
- Uint16 *src_pos = (Uint16 *)byte_src_pos;
- Uint16 *dst_pos = (Uint16 *)byte_dst_pos;
- #ifdef I80_FB_PATCH
- printf("%s:width %d,height %d\n",__FUNCTION__,width,height);
- #endif
- while (height) {
- Uint16 *src = src_pos;
- Uint16 *dst = dst_pos;
-
- for (w = width; w != 0; w--) {
- #ifdef I80_FB_PATCH
- if(is_odd)
- {
- //写在下一位
- *(dst+1) = *src;
- is_odd = 0;
- }
- else
- {
- *(dst-1) = *src;
- is_odd = 1;
- }
- #else
- *dst = *src;
- #endif
- src += src_right_delta;
- dst++;
- }
- dst_pos = (Uint16 *)((Uint8 *)dst_pos + dst_linebytes);
- src_pos += src_down_delta;
- height--;
- }
- }
其中的#ifdef I80_FB_PATCH 内容就是调整内容,在运行前还在在FB_VideoInit()的最后面加入
#ifdef I80_FB_PATCH
shadow_fb = 1;//作数据对调
#endif
实测效果不错,原来丢数据显示不清的图像基本显示成功,但效率上会有小的损失,因此现在相当于是两buffer保存同一个图像,在显示前还要做转换。但是在修改很快。因此使用这个方案。
阅读(1727) | 评论(0) | 转发(0) |