4 void lcd_copy_buffer_rect(fb_data
*dst
, fb_data
*src
, int width
, int height
)
7 memcpy(dst
, src
, width
* sizeof(fb_data
));
19 static inline int clamp(int val
, int min
, int max
)
28 extern void lcd_write_yuv420_lines(fb_data
*dst
,
29 unsigned char const * const src
[3],
33 /* Draw a partial YUV colour bitmap - similiar behavior to lcd_blit_yuv
35 const unsigned char *ysrc
, *usrc
, *vsrc
;
36 int height
= 2, linecounter
;
39 /* width and height must be >= 2 and an even number */
41 linecounter
= height
>> 1;
43 #if LCD_WIDTH >= LCD_HEIGHT
44 row_end
= dst
+ width
;
46 row_end
= dst
+ LCD_WIDTH
* width
;
53 /* stride => amount to jump from end of last row to start of next */
56 /* upsampling, YUV->RGB conversion and reduction to RGB565 in one go */
60 int y
, cb
, cr
, rv
, guv
, bu
, r
, g
, b
;
62 y
= YFAC
*(*ysrc
++ - 16);
67 guv
= GUFAC
*cb
+ GVFAC
*cr
;
74 if ((unsigned)(r
| g
| b
) > 64*256-1)
76 r
= clamp(r
, 0, 64*256-1);
77 g
= clamp(g
, 0, 64*256-1);
78 b
= clamp(b
, 0, 64*256-1);
81 *dst
= LCD_RGBPACK_LCD(r
>> 9, g
>> 8, b
>> 9);
83 #if LCD_WIDTH >= LCD_HEIGHT
89 y
= YFAC
*(*ysrc
++ - 16);
94 if ((unsigned)(r
| g
| b
) > 64*256-1)
96 r
= clamp(r
, 0, 64*256-1);
97 g
= clamp(g
, 0, 64*256-1);
98 b
= clamp(b
, 0, 64*256-1);
101 *dst
= LCD_RGBPACK_LCD(r
>> 9, g
>> 8, b
>> 9);
103 #if LCD_WIDTH >= LCD_HEIGHT
109 while (dst
< row_end
);
115 #if LCD_WIDTH >= LCD_HEIGHT
116 row_end
+= LCD_WIDTH
;
117 dst
+= LCD_WIDTH
- width
;
120 dst
-= LCD_WIDTH
*width
+ 1;
125 int y
, cb
, cr
, rv
, guv
, bu
, r
, g
, b
;
127 y
= YFAC
*(*ysrc
++ - 16);
132 guv
= GUFAC
*cb
+ GVFAC
*cr
;
139 if ((unsigned)(r
| g
| b
) > 64*256-1)
141 r
= clamp(r
, 0, 64*256-1);
142 g
= clamp(g
, 0, 64*256-1);
143 b
= clamp(b
, 0, 64*256-1);
146 *dst
= LCD_RGBPACK_LCD(r
>> 9, g
>> 8, b
>> 9);
148 #if LCD_WIDTH >= LCD_HEIGHT
154 y
= YFAC
*(*ysrc
++ - 16);
159 if ((unsigned)(r
| g
| b
) > 64*256-1)
161 r
= clamp(r
, 0, 64*256-1);
162 g
= clamp(g
, 0, 64*256-1);
163 b
= clamp(b
, 0, 64*256-1);
166 *dst
= LCD_RGBPACK_LCD(r
>> 9, g
>> 8, b
>> 9);
168 #if LCD_WIDTH >= LCD_HEIGHT
174 while (dst
< row_end
);
177 void lcd_write_yuv420_lines_odither(fb_data
*dst
,
178 unsigned char const * const src
[3],
179 int width
, int stride
,
180 int x_screen
, int y_screen
)
181 __attribute__((alias("lcd_write_yuv420_lines")));