+ if(pitch <= 0) {
+ pitch = cur_mode->pitch;
+ }
+ cur_mode->ops.blitfb(fb, pitch);
+}
+
+void vid_blitfb32(uint32_t *src, int pitch)
+{
+ int i, j, winpos, winleft;
+ unsigned char *dest;
+ uint16_t *dest16;
+
+ if(cur_mode->bpp == 32) {
+ vid_blitfb(src, pitch);
+ return;
+ }
+
+ if(pitch <= 0) {
+ pitch = cur_mode->width << 2;
+ }
+
+ if(vid_islinear()) {
+ winleft = INT_MAX;
+ } else {
+ winleft = 65536;/*cur_mode->win_size << 10;*/
+ winpos = 0;
+ vid_setwin(0, 0);
+ }
+
+ switch(cur_mode->bpp) {
+ case 8:
+ /* TODO */
+ break;
+
+ case 15:
+ /* TODO */
+ break;
+ case 16:
+ /* TODO */
+ break;
+
+ case 24:
+ dest = vid_vmem;
+ for(i=0; i<cur_mode->height; i++) {
+ for(j=0; j<cur_mode->width; j++) {
+ uint32_t pixel = src[j];
+ if(winleft <= 0) {
+ winpos += cur_mode->win_step;
+ vid_setwin(0, winpos);
+ winleft = 65536;/*cur_mode->win_size << 10;*/
+ dest = vid_vmem;
+ }
+ dest[0] = (pixel >> 16) & 0xff;
+ dest[1] = (pixel >> 8) & 0xff;
+ dest[2] = pixel & 0xff;
+ dest += 3;
+ winleft -= 3;
+ }
+ src = (uint32_t*)((char*)src + pitch);
+ }
+ break;
+
+ default:
+ break;
+ }