28
28
#include <linux/kd.h>
29
29
30
30
#include <pixelflinger/pixelflinger.h>
31
+ #include <cutils/memory.h>
31
32
32
33
#ifndef BOARD_LDPI_RECOVERY
33
34
#include "font_10x18.h"
@@ -109,7 +110,7 @@ static int get_framebuffer(GGLSurface *fb)
109
110
fb -> data = (void * ) (((unsigned ) bits ) + vi .yres * fi .line_length );
110
111
#else
111
112
fb -> stride = vi .xres ;
112
- fb -> data = (void * ) (((unsigned ) bits ) + vi .yres * vi .xres * 2 );
113
+ fb -> data = (void * ) (((unsigned ) bits ) + ( vi .yres * vi .xres * vi . bits_per_pixel / 8 ) );
113
114
#endif
114
115
fb -> format = GGL_PIXEL_FORMAT_RGB_565 ;
115
116
memset (fb -> data , 0 , vi .yres * vi .xres * 2 );
@@ -129,14 +130,35 @@ static void get_memory_surface(GGLSurface* ms) {
129
130
static void set_active_framebuffer (unsigned n )
130
131
{
131
132
if (n > 1 ) return ;
132
- // vi.yres_virtual = vi.yres * 2;
133
+ vi .yres_virtual = vi .yres * 2 ;
133
134
vi .yoffset = n * vi .yres ;
134
- vi .bits_per_pixel = 16 ;
135
135
if (ioctl (gr_fb_fd , FBIOPUT_VSCREENINFO , & vi ) < 0 ) {
136
136
perror ("active fb swap failed" );
137
137
}
138
138
}
139
139
140
+ void gr_flip_32 (unsigned * bits , unsigned short * ptr , unsigned count )
141
+ {
142
+ unsigned i = 0 ;
143
+ while (i < count ) {
144
+ uint32_t rgb32 , red , green , blue , alpha ;
145
+
146
+ /* convert 16 bits to 32 bits */
147
+ rgb32 = ((ptr [i ] >> 11 ) & 0x1F );
148
+ red = (rgb32 << 3 ) | (rgb32 >> 2 );
149
+ rgb32 = ((ptr [i ] >> 5 ) & 0x3F );
150
+ green = (rgb32 << 2 ) | (rgb32 >> 4 );
151
+ rgb32 = ((ptr [i ]) & 0x1F );
152
+ blue = (rgb32 << 3 ) | (rgb32 >> 2 );
153
+ alpha = 0xff ;
154
+ rgb32 = (alpha << 24 ) | (blue << 16 )
155
+ | (green << 8 ) | (red );
156
+ android_memset32 ((uint32_t * )bits , rgb32 , 4 );
157
+ i ++ ;
158
+ bits ++ ;
159
+ }
160
+ }
161
+
140
162
void gr_flip (void )
141
163
{
142
164
GGLContext * gl = gr_context ;
@@ -156,8 +178,17 @@ void gr_flip(void)
156
178
157
179
/* copy data from the in-memory surface to the buffer we're about
158
180
* to make active. */
159
- memcpy (gr_framebuffer [gr_active_fb ].data , gr_mem_surface .data ,
160
- vi .xres * vi .yres * 2 );
181
+ if ( vi .bits_per_pixel == 16 )
182
+ {
183
+ memcpy (gr_framebuffer [gr_active_fb ].data , gr_mem_surface .data ,
184
+ vi .xres * vi .yres * 2 );
185
+ }
186
+ else
187
+ {
188
+ gr_flip_32 ((unsigned * )gr_framebuffer [gr_active_fb ].data ,
189
+ (unsigned short * )gr_mem_surface .data ,
190
+ (vi .xres * vi .yres ));
191
+ }
161
192
162
193
/* inform the display driver */
163
194
set_active_framebuffer (gr_active_fb );
0 commit comments