commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[1856] 2008-09-07 Vesa J?\195?\164?\195?\164skel?\195?\164inen <address@


From: Vesa Jääskeläinen
Subject: [1856] 2008-09-07 Vesa J?\195?\164?\195?\164skel?\195?\164inen <address@hidden .fi>
Date: Sun, 07 Sep 2008 15:55:59 +0000

Revision: 1856
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=1856
Author:   chaac
Date:     2008-09-07 15:55:58 +0000 (Sun, 07 Sep 2008)

Log Message:
-----------
2008-09-07  Vesa J?\195?\164?\195?\164skel?\195?\164inen  <address@hidden>

        Based on patch created by Colin D Bennett <address@hidden>.
        Adds optimization support for BGR based modes.

        * include/grub/i386/pc/vbeblit.h 
(grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8) Removed.
        (grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8_R8G8B8A8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8_R8G8B8X8): Likewise.
        (grub_video_i386_vbeblit_index_R8G8B8A8): Likewise.
        (grub_video_i386_vbeblit_index_R8G8B8X8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8A8_R8G8B8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8_R8G8B8): Likewise.
        (grub_video_i386_vbeblit_index_R8G8B8): Likewise.
        (grub_video_i386_vbeblit_index_index): Likewise.
        (grub_video_i386_vbeblit_replace_directN): Added.
        (grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_BGRX8888_RGB888): Likewise.
        (grub_video_i386_vbeblit_replace_BGR888_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_BGR888_RGB888): Likewise.
        (grub_video_i386_vbeblit_replace_RGBX8888_RGB888): Likewise.
        (grub_video_i386_vbeblit_replace_RGB888_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_index_RGBX8888): Likewise.     
        (grub_video_i386_vbeblit_replace_index_RGB888): Likewise.
        (grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_BGR888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_RGB888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_index_RGBA8888): Likewise.

        * include/grub/i386/pc/vbefill.h (grub_video_i386_vbefill_R8G8B8A8) 
Removed.
        (grub_video_i386_vbefill_R8G8B8): Likewise.
        (grub_video_i386_vbefill_index): Likewise.
        (grub_video_i386_vbefill_direct32): Added.
        (grub_video_i386_vbefill_direct24): Likewise.
        (grub_video_i386_vbefill_direct16): Likewise.
        (grub_video_i386_vbefill_direct8): Likewise.

        * include/grub/video.h (grub_video_blit_format): Removed 
        GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8, GRUB_VIDEO_BLIT_FORMAT_R8G8B8.
        (grub_video_blit_format): Added GRUB_VIDEO_BLIT_FORMAT_RGBA_8888,
        GRUB_VIDEO_BLIT_FORMAT_BGRA_8888, GRUB_VIDEO_BLIT_FORMAT_RGB_888,
        GRUB_VIDEO_BLIT_FORMAT_BGR_888, GRUB_VIDEO_BLIT_FORMAT_RGB_565,
        GRUB_VIDEO_BLIT_FORMAT_BGR_565.
        
        * video/video.c (grub_video_get_blit_format): Updated to use new
        blit formats.  Added handling for 16 bit color modes.
        
        * video/i386/pc/vbe.c (grub_video_vbe_fill_rect): Updated to use new 
        fillers.
        (common_blitter): Updated to use new blitters.

        * video/i386/pc/vbeblit.c (grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8):
        Removed.
        (grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8_R8G8B8A8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8_R8G8B8X8): Likewise.
        (grub_video_i386_vbeblit_index_R8G8B8A8): Likewise.
        (grub_video_i386_vbeblit_index_R8G8B8X8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8A8_R8G8B8): Likewise.
        (grub_video_i386_vbeblit_R8G8B8_R8G8B8): Likewise.
        (grub_video_i386_vbeblit_index_R8G8B8): Likewise.
        (grub_video_i386_vbeblit_index_index): Likewise.
        (grub_video_i386_vbeblit_replace_directN): Added.
        (grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_BGRX8888_RGB888): Likewise.
        (grub_video_i386_vbeblit_replace_BGR888_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_BGR888_RGB888): Likewise.
        (grub_video_i386_vbeblit_replace_RGBX8888_RGB888): Likewise.
        (grub_video_i386_vbeblit_replace_RGB888_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_index_RGBX8888): Likewise.
        (grub_video_i386_vbeblit_replace_index_RGB888): Likewise.
        (grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_BGR888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_RGB888_RGBA8888): Likewise.
        (grub_video_i386_vbeblit_blend_index_RGBA8888): Likewise.
        
        * video/i386/pc/vbefill.c (grub_video_i386_vbefill_R8G8B8A8): Removed.
        (grub_video_i386_vbefill_R8G8B8): Likewise.
        (grub_video_i386_vbefill_index): Likewise.
        (grub_video_i386_vbefill_direct32): Added.
        (grub_video_i386_vbefill_direct24): Likewise.
        (grub_video_i386_vbefill_direct16): Likewise.
        (grub_video_i386_vbefill_direct8): Likewise.
        
        * video/readers/jpeg.c (grub_jpeg_decode_sos): Adapt to new blitter
        types.
        
        * video/readers/tga.c (grub_video_reader_tga): Adapt to new blitter
        types.
        
        * video/readers/png.c (grub_png_decode_image_header): Adapt to new
        blitter types.
        
        * video/bitmap.c (grub_video_bitmap_create): Adapt to new blitter
        types.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/include/grub/i386/pc/vbeblit.h
    trunk/grub2/include/grub/i386/pc/vbefill.h
    trunk/grub2/include/grub/video.h
    trunk/grub2/video/bitmap.c
    trunk/grub2/video/i386/pc/vbe.c
    trunk/grub2/video/i386/pc/vbeblit.c
    trunk/grub2/video/i386/pc/vbefill.c
    trunk/grub2/video/readers/jpeg.c
    trunk/grub2/video/readers/png.c
    trunk/grub2/video/readers/tga.c
    trunk/grub2/video/video.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/ChangeLog       2008-09-07 15:55:58 UTC (rev 1856)
@@ -1,3 +1,101 @@
+2008-09-07  Vesa Jääskeläinen  <address@hidden>
+
+       Based on patch created by Colin D Bennett <address@hidden>.
+       Adds optimization support for BGR based modes.
+
+       * include/grub/i386/pc/vbeblit.h 
(grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8) Removed.
+       (grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8_R8G8B8A8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8_R8G8B8X8): Likewise.
+       (grub_video_i386_vbeblit_index_R8G8B8A8): Likewise.
+       (grub_video_i386_vbeblit_index_R8G8B8X8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8A8_R8G8B8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8_R8G8B8): Likewise.
+       (grub_video_i386_vbeblit_index_R8G8B8): Likewise.
+       (grub_video_i386_vbeblit_index_index): Likewise.
+       (grub_video_i386_vbeblit_replace_directN): Added.
+       (grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_BGRX8888_RGB888): Likewise.
+       (grub_video_i386_vbeblit_replace_BGR888_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_BGR888_RGB888): Likewise.
+       (grub_video_i386_vbeblit_replace_RGBX8888_RGB888): Likewise.
+       (grub_video_i386_vbeblit_replace_RGB888_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_index_RGBX8888): Likewise.     
+       (grub_video_i386_vbeblit_replace_index_RGB888): Likewise.
+       (grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_BGR888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_RGB888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_index_RGBA8888): Likewise.
+
+       * include/grub/i386/pc/vbefill.h (grub_video_i386_vbefill_R8G8B8A8) 
Removed.
+       (grub_video_i386_vbefill_R8G8B8): Likewise.
+       (grub_video_i386_vbefill_index): Likewise.
+       (grub_video_i386_vbefill_direct32): Added.
+       (grub_video_i386_vbefill_direct24): Likewise.
+       (grub_video_i386_vbefill_direct16): Likewise.
+       (grub_video_i386_vbefill_direct8): Likewise.
+
+       * include/grub/video.h (grub_video_blit_format): Removed 
+       GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8, GRUB_VIDEO_BLIT_FORMAT_R8G8B8.
+       (grub_video_blit_format): Added GRUB_VIDEO_BLIT_FORMAT_RGBA_8888,
+       GRUB_VIDEO_BLIT_FORMAT_BGRA_8888, GRUB_VIDEO_BLIT_FORMAT_RGB_888,
+       GRUB_VIDEO_BLIT_FORMAT_BGR_888, GRUB_VIDEO_BLIT_FORMAT_RGB_565,
+       GRUB_VIDEO_BLIT_FORMAT_BGR_565.
+       
+       * video/video.c (grub_video_get_blit_format): Updated to use new
+       blit formats.  Added handling for 16 bit color modes.
+       
+       * video/i386/pc/vbe.c (grub_video_vbe_fill_rect): Updated to use new 
+       fillers.
+       (common_blitter): Updated to use new blitters.
+
+       * video/i386/pc/vbeblit.c (grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8):
+       Removed.
+       (grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8_R8G8B8A8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8_R8G8B8X8): Likewise.
+       (grub_video_i386_vbeblit_index_R8G8B8A8): Likewise.
+       (grub_video_i386_vbeblit_index_R8G8B8X8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8A8_R8G8B8): Likewise.
+       (grub_video_i386_vbeblit_R8G8B8_R8G8B8): Likewise.
+       (grub_video_i386_vbeblit_index_R8G8B8): Likewise.
+       (grub_video_i386_vbeblit_index_index): Likewise.
+       (grub_video_i386_vbeblit_replace_directN): Added.
+       (grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_BGRX8888_RGB888): Likewise.
+       (grub_video_i386_vbeblit_replace_BGR888_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_BGR888_RGB888): Likewise.
+       (grub_video_i386_vbeblit_replace_RGBX8888_RGB888): Likewise.
+       (grub_video_i386_vbeblit_replace_RGB888_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_index_RGBX8888): Likewise.
+       (grub_video_i386_vbeblit_replace_index_RGB888): Likewise.
+       (grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_BGR888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_RGB888_RGBA8888): Likewise.
+       (grub_video_i386_vbeblit_blend_index_RGBA8888): Likewise.
+       
+       * video/i386/pc/vbefill.c (grub_video_i386_vbefill_R8G8B8A8): Removed.
+       (grub_video_i386_vbefill_R8G8B8): Likewise.
+       (grub_video_i386_vbefill_index): Likewise.
+       (grub_video_i386_vbefill_direct32): Added.
+       (grub_video_i386_vbefill_direct24): Likewise.
+       (grub_video_i386_vbefill_direct16): Likewise.
+       (grub_video_i386_vbefill_direct8): Likewise.
+       
+       * video/readers/jpeg.c (grub_jpeg_decode_sos): Adapt to new blitter
+       types.
+       
+       * video/readers/tga.c (grub_video_reader_tga): Adapt to new blitter
+       types.
+       
+       * video/readers/png.c (grub_png_decode_image_header): Adapt to new
+       blitter types.
+       
+       * video/bitmap.c (grub_video_bitmap_create): Adapt to new blitter
+       types.
+
 2008-09-06  Felix Zielcke  <address@hidden>
 
        * disk/raid.c (insert_array): Set `array->chunk_size' to 64 for

Modified: trunk/grub2/include/grub/i386/pc/vbeblit.h
===================================================================
--- trunk/grub2/include/grub/i386/pc/vbeblit.h  2008-09-06 13:56:15 UTC (rev 
1855)
+++ trunk/grub2/include/grub/i386/pc/vbeblit.h  2008-09-07 15:55:58 UTC (rev 
1856)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2006,2007  Free Software Foundation, Inc.
+ *  Copyright (C) 2006,2007,2008  Free Software Foundation, Inc.
  *
  *  GRUB is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -25,64 +25,70 @@
 struct grub_video_i386_vbeblit_info;
 
 void
-grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                           struct grub_video_i386_vbeblit_info 
*src,
-                                           int x, int y, int width, int height,
-                                           int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace (struct grub_video_i386_vbeblit_info *dst,
+                                 struct grub_video_i386_vbeblit_info *src,
+                                 int x, int y, int width, int height,
+                                 int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                           struct grub_video_i386_vbeblit_info 
*src,
-                                           int x, int y, int width, int height,
-                                           int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_directN (struct grub_video_i386_vbeblit_info 
*dst,
+                                        struct grub_video_i386_vbeblit_info 
*src,
+                                        int x, int y, int width, int height,
+                                        int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_R8G8B8_R8G8B8A8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                         struct grub_video_i386_vbeblit_info 
*src,
-                                         int x, int y, int width, int height,
-                                         int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                  struct 
grub_video_i386_vbeblit_info *src,
+                                                  int x, int y, int width, int 
height,
+                                                  int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_R8G8B8_R8G8B8X8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                         struct grub_video_i386_vbeblit_info 
*src,
-                                         int x, int y, int width, int height,
-                                         int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_BGRX8888_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_index_R8G8B8A8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                        struct grub_video_i386_vbeblit_info 
*src,
-                                        int x, int y, int width, int height,
-                                        int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_BGR888_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_index_R8G8B8X8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                        struct grub_video_i386_vbeblit_info 
*src,
-                                        int x, int y, int width, int height,
-                                        int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_BGR888_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                              struct 
grub_video_i386_vbeblit_info *src,
+                                              int x, int y,
+                                              int width, int height,
+                                              int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_R8G8B8A8_R8G8B8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                         struct grub_video_i386_vbeblit_info 
*src,
-                                         int x, int y, int width, int height,
-                                         int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_RGBX8888_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_R8G8B8_R8G8B8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                       struct grub_video_i386_vbeblit_info 
*src,
-                                       int x, int y, int width, int height,
-                                       int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_RGB888_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_index_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,
-                                      struct grub_video_i386_vbeblit_info *src,
-                                      int x, int y, int width, int height,
-                                      int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_index_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                               struct 
grub_video_i386_vbeblit_info *src,
+                                               int x, int y,
+                                               int width, int height,
+                                               int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_index_index (struct grub_video_i386_vbeblit_info *dst,
-                                     struct grub_video_i386_vbeblit_info *src,
-                                     int x, int y, int width, int height,
-                                     int offset_x, int offset_y);
+grub_video_i386_vbeblit_replace_index_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                             struct 
grub_video_i386_vbeblit_info *src,
+                                             int x, int y, int width, int 
height,
+                                             int offset_x, int offset_y);
 
 void
 grub_video_i386_vbeblit_blend (struct grub_video_i386_vbeblit_info *dst,
@@ -91,9 +97,38 @@
                                int offset_x, int offset_y);
 
 void
-grub_video_i386_vbeblit_replace (struct grub_video_i386_vbeblit_info *dst,
-                                 struct grub_video_i386_vbeblit_info *src,
-                                 int x, int y, int width, int height,
-                                 int offset_x, int offset_y);
+grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y);
 
+void
+grub_video_i386_vbeblit_blend_BGR888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                              struct 
grub_video_i386_vbeblit_info *src,
+                                              int x, int y,
+                                              int width, int height,
+                                              int offset_x, int offset_y);
+
+void
+grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y);
+
+void
+grub_video_i386_vbeblit_blend_RGB888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                              struct 
grub_video_i386_vbeblit_info *src,
+                                              int x, int y,
+                                              int width, int height,
+                                              int offset_x, int offset_y);
+
+void
+grub_video_i386_vbeblit_blend_index_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                             struct 
grub_video_i386_vbeblit_info *src,
+                                             int x, int y,
+                                             int width, int height,
+                                             int offset_x, int offset_y);
+
 #endif /* ! GRUB_VBEBLIT_MACHINE_HEADER */

Modified: trunk/grub2/include/grub/i386/pc/vbefill.h
===================================================================
--- trunk/grub2/include/grub/i386/pc/vbefill.h  2008-09-06 13:56:15 UTC (rev 
1855)
+++ trunk/grub2/include/grub/i386/pc/vbefill.h  2008-09-07 15:55:58 UTC (rev 
1856)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2006,2007  Free Software Foundation, Inc.
+ *  Copyright (C) 2006,2007,2008  Free Software Foundation, Inc.
  *
  *  GRUB is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -25,23 +25,28 @@
 struct grub_video_i386_vbeblit_info;
 
 void
-grub_video_i386_vbefill_R8G8B8A8 (struct grub_video_i386_vbeblit_info *dst,
+grub_video_i386_vbefill (struct grub_video_i386_vbeblit_info *dst,
+                         grub_video_color_t color, int x, int y,
+                         int width, int height);
+
+void
+grub_video_i386_vbefill_direct32 (struct grub_video_i386_vbeblit_info *dst,
                                   grub_video_color_t color,  int x, int y,
                                   int width, int height);
 
 void
-grub_video_i386_vbefill_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,
-                                grub_video_color_t color, int x, int y,
-                                int width, int height);
+grub_video_i386_vbefill_direct24 (struct grub_video_i386_vbeblit_info *dst,
+                                  grub_video_color_t color, int x, int y,
+                                  int width, int height);
 
 void
-grub_video_i386_vbefill_index (struct grub_video_i386_vbeblit_info *dst,
-                               grub_video_color_t color, int x, int y,
-                               int width, int height);
+grub_video_i386_vbefill_direct16 (struct grub_video_i386_vbeblit_info *dst,
+                                  grub_video_color_t color, int x, int y,
+                                  int width, int height);
 
 void
-grub_video_i386_vbefill (struct grub_video_i386_vbeblit_info *dst,
-                         grub_video_color_t color, int x, int y,
-                         int width, int height);
+grub_video_i386_vbefill_direct8 (struct grub_video_i386_vbeblit_info *dst,
+                                grub_video_color_t color, int x, int y,
+                                int width, int height);
 
 #endif /* ! GRUB_VBEFILL_MACHINE_HEADER */

Modified: trunk/grub2/include/grub/video.h
===================================================================
--- trunk/grub2/include/grub/video.h    2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/include/grub/video.h    2008-09-07 15:55:58 UTC (rev 1856)
@@ -26,7 +26,7 @@
    specific coding format.  */
 typedef grub_uint32_t grub_video_color_t;
 
-/* This structure is driver specific and should not be accessed directly by 
+/* This structure is driver specific and should not be accessed directly by
    outside code.  */
 struct grub_video_render_target;
 
@@ -55,14 +55,22 @@
 /* Defined blitting formats.  */
 enum grub_video_blit_format
   {
-    /* Follow exactly field & mask information.  */
+    /* Generic RGBA, use fields & masks.  */
     GRUB_VIDEO_BLIT_FORMAT_RGBA,
-    /* Make optimization assumption.  */
-    GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8,
-    /* Follow exactly field & mask information.  */
+
+    /* Optimized RGBA's.  */
+    GRUB_VIDEO_BLIT_FORMAT_RGBA_8888,
+    GRUB_VIDEO_BLIT_FORMAT_BGRA_8888,
+
+    /* Generic RGB, use fields & masks.  */
     GRUB_VIDEO_BLIT_FORMAT_RGB,
-    /* Make optimization assumption.  */
-    GRUB_VIDEO_BLIT_FORMAT_R8G8B8,
+
+    /* Optimized RGB's.  */
+    GRUB_VIDEO_BLIT_FORMAT_RGB_888,
+    GRUB_VIDEO_BLIT_FORMAT_BGR_888,
+    GRUB_VIDEO_BLIT_FORMAT_RGB_565,
+    GRUB_VIDEO_BLIT_FORMAT_BGR_565,
+
     /* When needed, decode color or just use value as is.  */
     GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR
   };
@@ -84,7 +92,7 @@
   /* Height of the screen.  */
   unsigned int height;
 
-  /* Mode type bitmask.  Contains information like is it Index color or 
+  /* Mode type bitmask.  Contains information like is it Index color or
      RGB mode.  */
   unsigned int mode_type;
 
@@ -124,7 +132,7 @@
   /* How many bits are reserved in color.  */
   unsigned int reserved_mask_size;
 
-  /* What is location of reserved color bits.  In Index Color mode, 
+  /* What is location of reserved color bits.  In Index Color mode,
      this is 0.  */
   unsigned int reserved_field_pos;
 };

Modified: trunk/grub2/video/bitmap.c
===================================================================
--- trunk/grub2/video/bitmap.c  2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/bitmap.c  2008-09-07 15:55:58 UTC (rev 1856)
@@ -78,7 +78,7 @@
 
   switch (blit_format)
     {
-      case GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8:
+      case GRUB_VIDEO_BLIT_FORMAT_RGBA_8888:
         mode_info->mode_type = GRUB_VIDEO_MODE_TYPE_RGB 
                                | GRUB_VIDEO_MODE_TYPE_ALPHA;
         mode_info->bpp = 32;
@@ -94,7 +94,7 @@
         mode_info->reserved_field_pos = 24;
         break;
 
-      case GRUB_VIDEO_BLIT_FORMAT_R8G8B8:
+      case GRUB_VIDEO_BLIT_FORMAT_RGB_888:
         mode_info->mode_type = GRUB_VIDEO_MODE_TYPE_RGB;
         mode_info->bpp = 24;
         mode_info->bytes_per_pixel = 3;

Modified: trunk/grub2/video/i386/pc/vbe.c
===================================================================
--- trunk/grub2/video/i386/pc/vbe.c     2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/i386/pc/vbe.c     2008-09-07 15:55:58 UTC (rev 1856)
@@ -217,7 +217,7 @@
     case 8: framebuffer.bytes_per_pixel = 1; break;
     default:
       grub_vbe_bios_set_mode (old_mode, 0);
-      return grub_error (GRUB_ERR_BAD_DEVICE, 
+      return grub_error (GRUB_ERR_BAD_DEVICE,
                          "cannot set VBE mode %x",
                          mode);
       break;
@@ -231,9 +231,9 @@
 
       /* Make sure that the BIOS can reach the palette.  */
       grub_memcpy (palette, vga_colors, sizeof (vga_colors));
-      status = grub_vbe_bios_set_palette_data (sizeof (vga_colors) 
-                                               / sizeof (struct 
grub_vbe_palette_data), 
-                                               0, 
+      status = grub_vbe_bios_set_palette_data (sizeof (vga_colors)
+                                               / sizeof (struct 
grub_vbe_palette_data),
+                                               0,
                                                palette);
 
       /* Just ignore the status.  */
@@ -413,7 +413,7 @@
   unsigned int i;
 
   /* Decode depth from mode_type.  If it is zero, then autodetect.  */
-  depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK) 
+  depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
           >> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
 
   /* Walk thru mode list and try to find matching mode.  */
@@ -490,7 +490,7 @@
   /* Try to initialize best mode found.  */
   if (best_mode != 0)
     {
-      /* If this fails, then we have mode selection heuristics problem, 
+      /* If this fails, then we have mode selection heuristics problem,
          or adapter failure.  */
       grub_vbe_set_video_mode (best_mode, &active_mode_info);
       if (grub_errno != GRUB_ERR_NONE)
@@ -538,8 +538,8 @@
       render_target->data = framebuffer.ptr;
 
       /* Copy default palette to initialize emulated palette.  */
-      for (i = 0; 
-           i < (sizeof (vga_colors) 
+      for (i = 0;
+           i < (sizeof (vga_colors)
                 / sizeof (struct grub_vbe_palette_data));
            i++)
         {
@@ -560,7 +560,7 @@
 grub_video_vbe_get_info (struct grub_video_mode_info *mode_info)
 {
   /* Copy mode info from active render target.  */
-  grub_memcpy (mode_info, &render_target->mode_info, 
+  grub_memcpy (mode_info, &render_target->mode_info,
                sizeof (struct grub_video_mode_info));
 
   return GRUB_ERR_NONE;
@@ -575,9 +575,9 @@
   if (framebuffer.index_color_mode)
     {
       /* TODO: Implement setting indexed color mode palette to hardware.  */
-      //status = grub_vbe_bios_set_palette_data (sizeof (vga_colors) 
-      //                                         / sizeof (struct 
grub_vbe_palette_data), 
-      //                                         0, 
+      //status = grub_vbe_bios_set_palette_data (sizeof (vga_colors)
+      //                                         / sizeof (struct 
grub_vbe_palette_data),
+      //                                         0,
       //                                         palette);
 
     }
@@ -646,6 +646,7 @@
   return GRUB_ERR_NONE;
 }
 
+/* Maps color name to target optimized color format.  */
 static grub_video_color_t
 grub_video_vbe_map_color (grub_uint32_t color_name)
 {
@@ -671,11 +672,12 @@
   return 0;
 }
 
+/* Maps RGB to target optimized color format.  */
 grub_video_color_t
 grub_video_vbe_map_rgb (grub_uint8_t red, grub_uint8_t green,
                         grub_uint8_t blue)
 {
-  if ((render_target->mode_info.mode_type 
+  if ((render_target->mode_info.mode_type
        & GRUB_VIDEO_MODE_TYPE_INDEX_COLOR) != 0)
     {
       int minindex = 0;
@@ -728,11 +730,12 @@
 
 }
 
+/* Maps RGBA to target optimized color format.  */
 grub_video_color_t
 grub_video_vbe_map_rgba (grub_uint8_t red, grub_uint8_t green,
                          grub_uint8_t blue, grub_uint8_t alpha)
 {
-  if ((render_target->mode_info.mode_type 
+  if ((render_target->mode_info.mode_type
        & GRUB_VIDEO_MODE_TYPE_INDEX_COLOR) != 0)
     /* No alpha available in index color modes, just use
        same value as in only RGB modes.  */
@@ -755,6 +758,7 @@
     }
 }
 
+/* Splits target optimized format to components.  */
 grub_err_t grub_video_vbe_unmap_color (grub_video_color_t color,
                                        grub_uint8_t *red, grub_uint8_t *green,
                                        grub_uint8_t *blue, grub_uint8_t *alpha)
@@ -765,10 +769,11 @@
   target_info.data = render_target->data;
 
   grub_video_vbe_unmap_color_int (&target_info, color, red, green, blue, 
alpha);
-  
+
   return GRUB_ERR_NONE;
 }
 
+/* Splits color in source format to components.  */
 void
 grub_video_vbe_unmap_color_int (struct grub_video_i386_vbeblit_info * source,
                                 grub_video_color_t color,
@@ -778,7 +783,7 @@
   struct grub_video_mode_info *mode_info;
   mode_info = source->mode_info;
 
-  if ((mode_info->mode_type 
+  if ((mode_info->mode_type
        & GRUB_VIDEO_MODE_TYPE_INDEX_COLOR) != 0)
     {
       /* If we have an out-of-bounds color, return transparent black.  */
@@ -875,27 +880,44 @@
   target.mode_info = &render_target->mode_info;
   target.data = render_target->data;
 
-  /* Try to figure out more optimized version.  */
-  if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
+  /* Try to figure out more optimized version.  Note that color is already
+     mapped to target format so we can make assumptions based on that.  */
+  if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
     {
-      grub_video_i386_vbefill_R8G8B8A8 (&target, color, x, y, 
+      grub_video_i386_vbefill_direct32 (&target, color, x, y,
                                         width, height);
       return GRUB_ERR_NONE;
     }
-
-  if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
+  else if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
     {
-      grub_video_i386_vbefill_R8G8B8 (&target, color, x, y,
-                                      width, height);
+      grub_video_i386_vbefill_direct32 (&target, color, x, y,
+                                        width, height);
       return GRUB_ERR_NONE;
     }
-
-  if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+  else if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_RGB_888)
     {
-      grub_video_i386_vbefill_index (&target, color, x, y,
-                                     width, height);
+      grub_video_i386_vbefill_direct24 (&target, color, x, y,
+                                        width, height);
       return GRUB_ERR_NONE;
     }
+  else if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_RGB_565)
+    {
+      grub_video_i386_vbefill_direct16 (&target, color, x, y,
+                                        width, height);
+      return GRUB_ERR_NONE;
+    }
+  else if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_BGR_565)
+    {
+      grub_video_i386_vbefill_direct16 (&target, color, x, y,
+                                        width, height);
+      return GRUB_ERR_NONE;
+    }
+  else if (target.mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+    {
+      grub_video_i386_vbefill_direct8 (&target, color, x, y,
+                                      width, height);
+      return GRUB_ERR_NONE;
+    }
 
   /* No optimized version found, use default (slow) filler.  */
   grub_video_i386_vbefill (&target, color, x, y, width, height);
@@ -965,15 +987,15 @@
   /* Draw glyph.  */
   for (j = 0; j < height; j++)
     for (i = 0; i < width; i++)
-      if ((glyph->bitmap[((i + x_offset) / 8) 
-                         + (j + y_offset) * (charwidth / 8)] 
+      if ((glyph->bitmap[((i + x_offset) / 8)
+                         + (j + y_offset) * (charwidth / 8)]
            & (1 << ((charwidth - (i + x_offset) - 1) % 8))))
         set_pixel (&target, x+i, y+j, color);
 
   return GRUB_ERR_NONE;
 }
 
-/* NOTE: This function assumes that given coordinates are within bounds of 
+/* NOTE: This function assumes that given coordinates are within bounds of
    handled data.  */
 static void
 common_blitter (struct grub_video_i386_vbeblit_info *target,
@@ -985,146 +1007,193 @@
   if (oper == GRUB_VIDEO_BLIT_REPLACE)
     {
       /* Try to figure out more optimized version for replace operator.  */
-      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
-        {
-          if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
-            {
-              grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8 (target, source,
-                                                         x, y, width, height,
-                                                         offset_x, offset_y);
-              return;
-            }
+      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
+       {
+         if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
+           {
+             grub_video_i386_vbeblit_replace_directN (target, source,
+                                                      x, y, width, height,
+                                                      offset_x, offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
+           {
+             grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888 (target, source,
+                                                                x, y, width, 
height,
+                                                                offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGR_888)
+           {
+             grub_video_i386_vbeblit_replace_BGR888_RGBX8888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGB_888)
+           {
+             grub_video_i386_vbeblit_replace_RGB888_RGBX8888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+           {
+             grub_video_i386_vbeblit_replace_index_RGBX8888 (target, source,
+                                                             x, y, width, 
height,
+                                                             offset_x, 
offset_y);
+             return;
+           }
+       }
+      else if (source->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGB_888)
+       {
+         if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
+           {
+             grub_video_i386_vbeblit_replace_BGRX8888_RGB888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
+           {
+             grub_video_i386_vbeblit_replace_RGBX8888_RGB888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGR_888)
+           {
+             grub_video_i386_vbeblit_replace_BGR888_RGB888 (target, source,
+                                                            x, y, width, 
height,
+                                                            offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGB_888)
+           {
+             grub_video_i386_vbeblit_replace_directN (target, source,
+                                                      x, y, width, height,
+                                                      offset_x, offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+           {
+             grub_video_i386_vbeblit_replace_index_RGB888 (target, source,
+                                                           x, y, width, height,
+                                                           offset_x, offset_y);
+             return;
+           }
+       }
+      else if (source->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
+       {
+         if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
+           {
+             grub_video_i386_vbeblit_replace_directN (target, source,
+                                                      x, y, width, height,
+                                                      offset_x, offset_y);
+             return;
+           }
+       }
+      else if (source->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+       {
+         if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+           {
+             grub_video_i386_vbeblit_replace_directN (target, source,
+                                                      x, y, width, height,
+                                                      offset_x, offset_y);
+             return;
+           }
+       }
 
-          if (target->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
-            {
-              grub_video_i386_vbeblit_R8G8B8_R8G8B8X8 (target, source,
-                                                       x, y, width, height,
-                                                       offset_x, offset_y);
-              return;
-            }
-
-          if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-            {
-              grub_video_i386_vbeblit_index_R8G8B8X8 (target, source,
-                                                      x, y, width, height,
-                                                      offset_x, offset_y);
-              return;
-            }
-        }
-
-      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
-        {
-          if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
-            {
-              grub_video_i386_vbeblit_R8G8B8A8_R8G8B8 (target, source,
-                                                       x, y, width, height,
-                                                       offset_x, offset_y);
-              return;
-            }
-
-          if (target->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
-            {
-              grub_video_i386_vbeblit_R8G8B8_R8G8B8 (target, source,
-                                                     x, y, width, height,
-                                                     offset_x, offset_y);
-              return;
-            }
-
-          if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-            {
-              grub_video_i386_vbeblit_index_R8G8B8 (target, source,
-                                                    x, y, width, height,
-                                                    offset_x, offset_y);
-              return;
-            }
-        }
-
-      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-        {
-          if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-            {
-              grub_video_i386_vbeblit_index_index (target, source,
-                                                   x, y, width, height,
-                                                   offset_x, offset_y);
-              return;
-            }
-        }
-
       /* No optimized replace operator found, use default (slow) blitter.  */
       grub_video_i386_vbeblit_replace (target, source, x, y, width, height,
-                                       offset_x, offset_y);
+                                      offset_x, offset_y);
     }
   else
     {
       /* Try to figure out more optimized blend operator.  */
-      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
-      {
-        if (target->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
-        {
-          grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8 (target, source,
-              x, y, width, height,
-              offset_x, offset_y);
-          return;
-        }
+      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
+       {
+         if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
+           {
+             grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
+           {
+             grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGR_888)
+           {
+             grub_video_i386_vbeblit_blend_BGR888_RGBA8888 (target, source,
+                                                            x, y, width, 
height,
+                                                            offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGB_888)
+           {
+             grub_video_i386_vbeblit_blend_RGB888_RGBA8888 (target, source,
+                                                            x, y, width, 
height,
+                                                            offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+           {
+             grub_video_i386_vbeblit_blend_index_RGBA8888 (target, source,
+                                                           x, y, width, height,
+                                                           offset_x, offset_y);
+             return;
+           }
+       }
+      else if (source->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGB_888)
+       {
+         /* Note: There is really no alpha information here, so blend is
+            changed to replace.  */
 
-        if (target->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
-        {
-          grub_video_i386_vbeblit_R8G8B8_R8G8B8A8 (target, source,
-              x, y, width, height,
-              offset_x, offset_y);
-          return;
-        }
+         if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGRA_8888)
+           {
+             grub_video_i386_vbeblit_replace_BGRX8888_RGB888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGBA_8888)
+           {
+             grub_video_i386_vbeblit_replace_RGBX8888_RGB888 (target, source,
+                                                              x, y, width, 
height,
+                                                              offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_BGR_888)
+           {
+             grub_video_i386_vbeblit_replace_BGR888_RGB888 (target, source,
+                                                            x, y, width, 
height,
+                                                            offset_x, 
offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_RGB_888)
+           {
+             grub_video_i386_vbeblit_replace_directN (target, source,
+                                                      x, y, width, height,
+                                                      offset_x, offset_y);
+             return;
+           }
+         else if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
+           {
+             grub_video_i386_vbeblit_replace_index_RGB888 (target, source,
+                                                           x, y, width, height,
+                                                           offset_x, offset_y);
+             return;
+           }
+       }
 
-        if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-        {
-          grub_video_i386_vbeblit_index_R8G8B8A8 (target, source,
-              x, y, width, height,
-              offset_x, offset_y);
-          return;
-        }
-      }
-
-      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
-      {
-        if (target->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8)
-        {
-          grub_video_i386_vbeblit_R8G8B8A8_R8G8B8 (target, source,
-              x, y, width, height,
-              offset_x, offset_y);
-          return;
-        }
-
-        if (target->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_R8G8B8)
-        {
-          grub_video_i386_vbeblit_R8G8B8_R8G8B8 (target, source,
-              x, y, width, height,
-              offset_x, offset_y);
-          return;
-        }
-
-        if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-        {
-          grub_video_i386_vbeblit_index_R8G8B8 (target, source,
-              x, y, width, height,
-              offset_x, offset_y);
-          return;
-        }
-      }
-
-      if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-      {
-        if (target->mode_info->blit_format == 
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR)
-        {
-          grub_video_i386_vbeblit_index_index (target, source,
-                                               x, y, width, height,
-                                               offset_x, offset_y);
-          return;
-        }
-      }
-
       /* No optimized blend operation found, use default (slow) blitter.  */
       grub_video_i386_vbeblit_blend (target, source, x, y, width, height,
-                                     offset_x, offset_y);
+                                    offset_x, offset_y);
     }
 }
 
@@ -1148,10 +1217,10 @@
     return GRUB_ERR_NONE;
   if ((y + (int)bitmap->mode_info.height) < 0)
     return GRUB_ERR_NONE;
-  if ((offset_x >= (int)bitmap->mode_info.width) 
+  if ((offset_x >= (int)bitmap->mode_info.width)
       || (offset_x + (int)width < 0))
     return GRUB_ERR_NONE;
-  if ((offset_y >= (int)bitmap->mode_info.height) 
+  if ((offset_y >= (int)bitmap->mode_info.height)
       || (offset_y + (int)height < 0))
     return GRUB_ERR_NONE;
 
@@ -1239,10 +1308,10 @@
     return GRUB_ERR_NONE;
   if ((y + (int)source->mode_info.height) < 0)
     return GRUB_ERR_NONE;
-  if ((offset_x >= (int)source->mode_info.width) 
+  if ((offset_x >= (int)source->mode_info.width)
       || (offset_x + (int)width < 0))
     return GRUB_ERR_NONE;
-  if ((offset_y >= (int)source->mode_info.height) 
+  if ((offset_y >= (int)source->mode_info.height)
       || (offset_y + (int)height < 0))
     return GRUB_ERR_NONE;
 
@@ -1304,7 +1373,7 @@
   target_info.data = render_target->data;
 
   /* Do actual blitting.  */
-  common_blitter (&target_info, &source_info, oper, x, y, width, height, 
+  common_blitter (&target_info, &source_info, oper, x, y, width, height,
                   offset_x, offset_y);
 
   return GRUB_ERR_NONE;
@@ -1350,7 +1419,7 @@
     }
 
   /* 2. Check if there is need to copy data.  */
-  if ((grub_abs (dx) < render_target->viewport.width) 
+  if ((grub_abs (dx) < render_target->viewport.width)
        && (grub_abs (dy) < render_target->viewport.height))
     {
       /* 3. Move data in render target.  */
@@ -1389,7 +1458,7 @@
 
   /* 4b. Fill left & right parts.  */
   if (dx > 0)
-    grub_video_vbe_fill_rect (color, 0, 0, 
+    grub_video_vbe_fill_rect (color, 0, 0,
                               dx, render_target->viewport.height);
   else if (dx < 0)
     {
@@ -1403,7 +1472,7 @@
   return GRUB_ERR_NONE;
 }
 
-static grub_err_t 
+static grub_err_t
 grub_video_vbe_swap_buffers (void)
 {
   /* TODO: Implement buffer swapping.  */
@@ -1445,7 +1514,7 @@
   /* Setup render target format.  */
   target->mode_info.width = width;
   target->mode_info.height = height;
-  target->mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_RGB 
+  target->mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_RGB
                                 | GRUB_VIDEO_MODE_TYPE_ALPHA;
   target->mode_info.bpp = 32;
   target->mode_info.bytes_per_pixel = 4;
@@ -1513,11 +1582,11 @@
     }
 
   if (target == GRUB_VIDEO_RENDER_TARGET_BACK_BUFFER)
-    return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, 
+    return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
                        "double buffering not implemented yet.");
 
   if (! target->data)
-    return grub_error (GRUB_ERR_BAD_ARGUMENT, 
+    return grub_error (GRUB_ERR_BAD_ARGUMENT,
                        "invalid render target given.");
 
   render_target = target;
@@ -1529,7 +1598,7 @@
 grub_video_vbe_get_active_render_target (struct grub_video_render_target 
**target)
 {
   *target = render_target;
-  
+
   return GRUB_ERR_NONE;
 }
 

Modified: trunk/grub2/video/i386/pc/vbeblit.c
===================================================================
--- trunk/grub2/video/i386/pc/vbeblit.c 2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/i386/pc/vbeblit.c 2008-09-07 15:55:58 UTC (rev 1856)
@@ -34,308 +34,245 @@
 #include <grub/types.h>
 #include <grub/video.h>
 
+/* Generic replacing blitter (slow).  Works for every supported format.  */
 void
-grub_video_i386_vbeblit_R8G8B8A8_R8G8B8A8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                           struct grub_video_i386_vbeblit_info 
*src,
-                                           int x, int y, int width, int height,
-                                           int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace (struct grub_video_i386_vbeblit_info *dst,
+                                struct grub_video_i386_vbeblit_info *src,
+                                int x, int y, int width, int height,
+                                int offset_x, int offset_y)
 {
-  grub_uint32_t color;
   int i;
   int j;
-  grub_uint32_t *srcptr;
-  grub_uint32_t *dstptr;
-  unsigned int sr;
-  unsigned int sg;
-  unsigned int sb;
-  unsigned int a;
-  unsigned int dr;
-  unsigned int dg;
-  unsigned int db;
+  grub_uint8_t src_red;
+  grub_uint8_t src_green;
+  grub_uint8_t src_blue;
+  grub_uint8_t src_alpha;
+  grub_video_color_t src_color;
+  grub_video_color_t dst_color;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
-      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
-      dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j);
-
       for (i = 0; i < width; i++)
-        {
-          color = *srcptr++;
+       {
+         src_color = get_pixel (src, i + offset_x, j + offset_y);
 
-          a = color >> 24;
+         grub_video_vbe_unmap_color_int (src, src_color, &src_red, &src_green,
+                                         &src_blue, &src_alpha);
 
-          if (a == 0)
-            {
-              dstptr++;
-              continue;
-            }
+         dst_color = grub_video_vbe_map_rgba (src_red, src_green,
+                                              src_blue, src_alpha);
 
-          if (a == 255)
-            {
-              *dstptr++ = color;
-              continue;
-            }
-
-          sr = (color >> 0) & 0xFF;
-          sg = (color >> 8) & 0xFF;
-          sb = (color >> 16) & 0xFF;
-
-          color = *dstptr;
-
-          dr = (color >> 0) & 0xFF;
-          dg = (color >> 8) & 0xFF;
-          db = (color >> 16) & 0xFF;
-
-          dr = (dr * (255 - a) + sr * a) / 255;
-          dg = (dg * (255 - a) + sg * a) / 255;
-          db = (db * (255 - a) + sb * a) / 255;
-
-          color = (a << 24) | (db << 16) | (dg << 8) | dr;
-
-          *dstptr++ = color;
-        }
+         set_pixel (dst, x + i, y + j, dst_color);
+       }
     }
 }
 
+/* Block copy replacing blitter.  Works with modes multiple of 8 bits.  */
 void
-grub_video_i386_vbeblit_R8G8B8X8_R8G8B8X8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                           struct grub_video_i386_vbeblit_info 
*src,
-                                           int x, int y, int width, int height,
-                                           int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_directN (struct grub_video_i386_vbeblit_info 
*dst,
+                                        struct grub_video_i386_vbeblit_info 
*src,
+                                        int x, int y, int width, int height,
+                                        int offset_x, int offset_y)
 {
   int j;
   grub_uint32_t *srcptr;
   grub_uint32_t *dstptr;
-  int pitch;
+  int bpp;
 
-  pitch = src->mode_info->bytes_per_pixel;
+  bpp = src->mode_info->bytes_per_pixel;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
       srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
       dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j);
 
-      grub_memmove (dstptr, srcptr, width * pitch);
+      grub_memmove (dstptr, srcptr, width * bpp);
     }
 }
 
+/* Optimized replacing blitter for RGBX8888 to BGRX8888.  */
 void
-grub_video_i386_vbeblit_R8G8B8_R8G8B8A8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                         struct grub_video_i386_vbeblit_info 
*src,
-                                         int x, int y, int width, int height,
-                                         int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_BGRX8888_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                  struct 
grub_video_i386_vbeblit_info *src,
+                                                  int x, int y,
+                                                  int width, int height,
+                                                  int offset_x, int offset_y)
 {
-  grub_uint32_t color;
   int i;
   int j;
-  grub_uint32_t *srcptr;
+  grub_uint8_t *srcptr;
   grub_uint8_t *dstptr;
-  unsigned int sr;
-  unsigned int sg;
-  unsigned int sb;
-  unsigned int a;
-  unsigned int dr;
-  unsigned int dg;
-  unsigned int db;
+  unsigned int srcrowskip;
+  unsigned int dstrowskip;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width;
+  dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  srcptr = (grub_uint8_t *) get_data_ptr (src, offset_x, offset_y);
+  dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
     {
-      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
-      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
-
       for (i = 0; i < width; i++)
         {
-          color = *srcptr++;
+          grub_uint8_t r = *srcptr++;
+          grub_uint8_t g = *srcptr++;
+          grub_uint8_t b = *srcptr++;
+          grub_uint8_t a = *srcptr++;
 
-          a = color >> 24;
+          *dstptr++ = b;
+          *dstptr++ = g;
+          *dstptr++ = r;
+          *dstptr++ = a;
+        }
 
-          if (a == 0)
-            {
-              dstptr += 3;
-              continue;
-            }
-
-          sr = (color >> 0) & 0xFF;
-          sg = (color >> 8) & 0xFF;
-          sb = (color >> 16) & 0xFF;
-
-          if (a == 255)
-            {
-              *dstptr++ = sr;
-              *dstptr++ = sg;
-              *dstptr++ = sb;
-
-              continue;
-            }
-
-          dr = dstptr[0];
-          dg = dstptr[1];
-          db = dstptr[2];
-
-          dr = (dr * (255 - a) + sr * a) / 255;
-          dg = (dg * (255 - a) + sg * a) / 255;
-          db = (db * (255 - a) + sb * a) / 255;
-
-          *dstptr++ = dr;
-          *dstptr++ = dg;
-          *dstptr++ = db;
-        }
+      srcptr += srcrowskip;
+      dstptr += dstrowskip;
     }
 }
 
+/* Optimized replacing blitter for RGB888 to BGRX8888.  */
 void
-grub_video_i386_vbeblit_R8G8B8_R8G8B8X8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                         struct grub_video_i386_vbeblit_info 
*src,
-                                         int x, int y, int width, int height,
-                                         int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_BGRX8888_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y)
 {
-  grub_uint32_t color;
   int i;
   int j;
-  grub_uint32_t *srcptr;
+  grub_uint8_t *srcptr;
   grub_uint8_t *dstptr;
-  unsigned int sr;
-  unsigned int sg;
-  unsigned int sb;
+  unsigned int srcrowskip;
+  unsigned int dstrowskip;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width;
+  dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  srcptr = (grub_uint8_t *) get_data_ptr (src, offset_x, offset_y);
+  dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
-  {
-    srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
-    dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
-
-    for (i = 0; i < width; i++)
     {
-      color = *srcptr++;
+      for (i = 0; i < width; i++)
+        {
+          grub_uint8_t r = *srcptr++;
+          grub_uint8_t g = *srcptr++;
+          grub_uint8_t b = *srcptr++;
 
-      sr = (color >> 0) & 0xFF;
-      sg = (color >> 8) & 0xFF;
-      sb = (color >> 16) & 0xFF;
+          *dstptr++ = b;
+          *dstptr++ = g;
+          *dstptr++ = r;
 
-      *dstptr++ = sr;
-      *dstptr++ = sg;
-      *dstptr++ = sb;
+          /* Set alpha component as opaque.  */
+          *dstptr++ = 255;
+        }
+
+      srcptr += srcrowskip;
+      dstptr += dstrowskip;
     }
-  }
 }
 
+/* Optimized replacing blitter for RGBX8888 to BGR888.  */
 void
-grub_video_i386_vbeblit_index_R8G8B8A8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                        struct grub_video_i386_vbeblit_info 
*src,
-                                        int x, int y, int width, int height,
-                                        int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_BGR888_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y)
 {
-  grub_uint32_t color;
+  grub_uint32_t *srcptr;
+  grub_uint8_t *dstptr;
+  unsigned int srcrowskip;
+  unsigned int dstrowskip;
   int i;
   int j;
-  grub_uint32_t *srcptr;
-  grub_uint8_t *dstptr;
-  unsigned int sr;
-  unsigned int sg;
-  unsigned int sb;
-  unsigned int a;
-  unsigned char dr;
-  unsigned char dg;
-  unsigned char db;
-  unsigned char da;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width;
+  dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  srcptr = (grub_uint32_t *) get_data_ptr (src, offset_x, offset_y);
+  dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
     {
-      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
-      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
-
       for (i = 0; i < width; i++)
         {
+          grub_uint32_t color;
+          grub_uint8_t sr;
+          grub_uint8_t sg;
+          grub_uint8_t sb;
+
           color = *srcptr++;
 
-          a = color >> 24;
-
-          if (a == 0)
-            {
-              dstptr++;
-              continue;
-            }
-
           sr = (color >> 0) & 0xFF;
           sg = (color >> 8) & 0xFF;
           sb = (color >> 16) & 0xFF;
 
-          if (a == 255)
-            {
-              color = grub_video_vbe_map_rgb(sr, sg, sb);
-              *dstptr++ = color & 0xFF;
-              continue;
-            }
+          *dstptr++ = sb;
+          *dstptr++ = sg;
+          *dstptr++ = sr;
+        }
 
-          grub_video_vbe_unmap_color_int (dst, *dstptr, &dr, &dg, &db, &da);
-
-          dr = (dr * (255 - a) + sr * a) / 255;
-          dg = (dg * (255 - a) + sg * a) / 255;
-          db = (db * (255 - a) + sb * a) / 255;
-
-          color = grub_video_vbe_map_rgb(dr, dg, db);
-
-          *dstptr++ = color & 0xFF;
-        }
+      srcptr = (grub_uint32_t *) (((grub_uint8_t *) srcptr) + srcrowskip);
+      dstptr += dstrowskip;
     }
 }
 
+/* Optimized replacing blitter for RGB888 to BGR888.  */
 void
-grub_video_i386_vbeblit_index_R8G8B8X8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                        struct grub_video_i386_vbeblit_info 
*src,
-                                        int x, int y, int width, int height,
-                                        int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_BGR888_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                              struct 
grub_video_i386_vbeblit_info *src,
+                                              int x, int y,
+                                              int width, int height,
+                                              int offset_x, int offset_y)
 {
-  grub_uint32_t color;
   int i;
   int j;
-  grub_uint32_t *srcptr;
+  grub_uint8_t *srcptr;
   grub_uint8_t *dstptr;
-  unsigned int sr;
-  unsigned int sg;
-  unsigned int sb;
+  unsigned int srcrowskip;
+  unsigned int dstrowskip;
 
-  /* We do not need to worry about data being out of bounds
-  as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width;
+  dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  srcptr = (grub_uint8_t *) get_data_ptr (src, offset_x, offset_y);
+  dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
-  {
-    srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
-    dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
-
-    for (i = 0; i < width; i++)
     {
-      color = *srcptr++;
+      for (i = 0; i < width; i++)
+        {
+          grub_uint8_t r = *srcptr++;
+          grub_uint8_t g = *srcptr++;
+          grub_uint8_t b = *srcptr++;
 
-      sr = (color >> 0) & 0xFF;
-      sg = (color >> 8) & 0xFF;
-      sb = (color >> 16) & 0xFF;
+          *dstptr++ = b;
+          *dstptr++ = g;
+          *dstptr++ = r;
+        }
 
-      color = grub_video_vbe_map_rgb(sr, sg, sb);
-      *dstptr++ = color & 0xFF;
+      srcptr += srcrowskip;
+      dstptr += dstrowskip;
     }
-  }
 }
 
+/* Optimized replacing blitter for RGB888 to RGBX8888.  */
 void
-grub_video_i386_vbeblit_R8G8B8A8_R8G8B8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                         struct grub_video_i386_vbeblit_info 
*src,
-                                         int x, int y, int width, int height,
-                                         int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_RGBX8888_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y)
 {
   grub_uint32_t color;
   int i;
@@ -346,9 +283,6 @@
   unsigned int sg;
   unsigned int sb;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
       srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);
@@ -360,6 +294,7 @@
           sg = *srcptr++;
           sb = *srcptr++;
 
+          /* Set alpha as opaque.  */
           color = 0xFF000000 | (sb << 16) | (sg << 8) | sr;
 
           *dstptr++ = color;
@@ -367,92 +302,115 @@
     }
 }
 
+/* Optimized replacing blitter for RGBX8888 to RGB888.  */
 void
-grub_video_i386_vbeblit_R8G8B8_R8G8B8 (struct grub_video_i386_vbeblit_info 
*dst,
-                                       struct grub_video_i386_vbeblit_info 
*src,
-                                       int x, int y, int width, int height,
-                                       int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_RGB888_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y)
 {
+  grub_uint32_t color;
+  int i;
   int j;
-  grub_uint8_t *srcptr;
+  grub_uint32_t *srcptr;
   grub_uint8_t *dstptr;
-  int pitch;
+  unsigned int sr;
+  unsigned int sg;
+  unsigned int sb;
 
-  pitch = src->mode_info->bytes_per_pixel;
-
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
-      srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);
+      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
       dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
 
-      grub_memmove (dstptr, srcptr, width * pitch);
+      for (i = 0; i < width; i++)
+       {
+         color = *srcptr++;
+
+         sr = (color >> 0) & 0xFF;
+         sg = (color >> 8) & 0xFF;
+         sb = (color >> 16) & 0xFF;
+
+         *dstptr++ = sr;
+         *dstptr++ = sg;
+         *dstptr++ = sb;
+       }
     }
 }
 
+/* Optimized replacing blitter for RGBX8888 to indexed color.  */
 void
-grub_video_i386_vbeblit_index_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,
-                                      struct grub_video_i386_vbeblit_info *src,
-                                      int x, int y, int width, int height,
-                                      int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_index_RGBX8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                               struct 
grub_video_i386_vbeblit_info *src,
+                                               int x, int y,
+                                               int width, int height,
+                                               int offset_x, int offset_y)
 {
   grub_uint32_t color;
   int i;
   int j;
-  grub_uint8_t *srcptr;
+  grub_uint32_t *srcptr;
   grub_uint8_t *dstptr;
   unsigned int sr;
   unsigned int sg;
   unsigned int sb;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
-      srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);
+      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
       dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
 
       for (i = 0; i < width; i++)
-        {
-          sr = *srcptr++;
-          sg = *srcptr++;
-          sb = *srcptr++;
+       {
+         color = *srcptr++;
 
-          color = grub_video_vbe_map_rgb(sr, sg, sb);
+         sr = (color >> 0) & 0xFF;
+         sg = (color >> 8) & 0xFF;
+         sb = (color >> 16) & 0xFF;
 
-          *dstptr++ = color & 0xFF;
-        }
+         color = grub_video_vbe_map_rgb(sr, sg, sb);
+         *dstptr++ = color & 0xFF;
+       }
     }
 }
 
+/* Optimized replacing blitter for RGB888 to indexed color.  */
 void
-grub_video_i386_vbeblit_index_index (struct grub_video_i386_vbeblit_info *dst,
-                                     struct grub_video_i386_vbeblit_info *src,
-                                     int x, int y, int width, int height,
-                                     int offset_x, int offset_y)
+grub_video_i386_vbeblit_replace_index_RGB888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                             struct 
grub_video_i386_vbeblit_info *src,
+                                             int x, int y,
+                                             int width, int height,
+                                             int offset_x, int offset_y)
 {
+  grub_uint32_t color;
+  int i;
   int j;
   grub_uint8_t *srcptr;
   grub_uint8_t *dstptr;
-  int pitch;
+  unsigned int sr;
+  unsigned int sg;
+  unsigned int sb;
 
-  pitch = src->mode_info->bytes_per_pixel;
-
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
       srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);
       dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
 
-      grub_memmove (dstptr, srcptr, width * pitch);
+      for (i = 0; i < width; i++)
+        {
+          sr = *srcptr++;
+          sg = *srcptr++;
+          sb = *srcptr++;
+
+          color = grub_video_vbe_map_rgb(sr, sg, sb);
+
+          *dstptr++ = color & 0xFF;
+        }
     }
 }
 
+/* Generic blending blitter.  Works for every supported format.  */
 void
 grub_video_i386_vbeblit_blend (struct grub_video_i386_vbeblit_info *dst,
                                struct grub_video_i386_vbeblit_info *src,
@@ -462,9 +420,6 @@
   int i;
   int j;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
-
   for (j = 0; j < height; j++)
     {
       for (i = 0; i < width; i++)
@@ -516,35 +471,358 @@
     }
 }
 
+/* Optimized blending blitter for RGBA8888 to BGRA8888.  */
 void
-grub_video_i386_vbeblit_replace (struct grub_video_i386_vbeblit_info *dst,
-                                 struct grub_video_i386_vbeblit_info *src,
-                                 int x, int y, int width, int height,
-                                 int offset_x, int offset_y)
+grub_video_i386_vbeblit_blend_BGRA8888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y)
 {
+  grub_uint32_t *srcptr;
+  grub_uint32_t *dstptr;
+  unsigned int srcrowskip;
+  unsigned int dstrowskip;
   int i;
   int j;
-  grub_uint8_t src_red;
-  grub_uint8_t src_green;
-  grub_uint8_t src_blue;
-  grub_uint8_t src_alpha;
-  grub_video_color_t src_color;
-  grub_video_color_t dst_color;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width;
+  dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  srcptr = (grub_uint32_t *) get_data_ptr (src, offset_x, offset_y);
+  dstptr = (grub_uint32_t *) get_data_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
-  {
-    for (i = 0; i < width; i++)
     {
-      src_color = get_pixel (src, i + offset_x, j + offset_y);
-      grub_video_vbe_unmap_color_int (src, src_color, &src_red, &src_green,
-                                  &src_blue, &src_alpha);
+      for (i = 0; i < width; i++)
+        {
+          grub_uint32_t color;
+          unsigned int sr;
+          unsigned int sg;
+          unsigned int sb;
+          unsigned int a;
+          unsigned int dr;
+          unsigned int dg;
+          unsigned int db;
 
-      dst_color = grub_video_vbe_map_rgba (src_red, src_green,
-                                           src_blue, src_alpha);
-      set_pixel (dst, x + i, y + j, dst_color);
+          color = *srcptr++;
+
+          a = color >> 24;
+
+          if (a == 0)
+            {
+              /* Skip transparent source pixels.  */
+              dstptr++;
+              continue;
+            }
+
+          sr = (color >> 0) & 0xFF;
+          sg = (color >> 8) & 0xFF;
+          sb = (color >> 16) & 0xFF;
+
+          if (a == 255)
+            {
+              /* Opaque pixel shortcut.  */
+              dr = sr;
+              dg = sg;
+              db = sb;
+            }
+          else
+            {
+              /* General pixel color blending.  */
+              color = *dstptr;
+
+              dr = (color >> 16) & 0xFF;
+              dr = (dr * (255 - a) + sr * a) / 255;
+              dg = (color >> 8) & 0xFF;
+              dg = (dg * (255 - a) + sg * a) / 255;
+              db = (color >> 0) & 0xFF;
+              db = (db * (255 - a) + sb * a) / 255;
+            }
+
+          color = (a << 24) | (dr << 16) | (dg << 8) | db;
+
+          *dstptr++ = color;
+        }
+
+      srcptr = (grub_uint32_t *) (((grub_uint8_t *) srcptr) + srcrowskip);
+      dstptr = (grub_uint32_t *) (((grub_uint8_t *) dstptr) + dstrowskip);
     }
-  }
 }
+
+/* Optimized blending blitter for RGBA8888 to BGR888.  */
+void
+grub_video_i386_vbeblit_blend_BGR888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                              struct 
grub_video_i386_vbeblit_info *src,
+                                              int x, int y,
+                                              int width, int height,
+                                              int offset_x, int offset_y)
+{
+  grub_uint32_t *srcptr;
+  grub_uint8_t *dstptr;
+  unsigned int srcrowskip;
+  unsigned int dstrowskip;
+  int i;
+  int j;
+
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  srcrowskip = src->mode_info->pitch - src->mode_info->bytes_per_pixel * width;
+  dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
+
+  srcptr = (grub_uint32_t *) get_data_ptr (src, offset_x, offset_y);
+  dstptr = (grub_uint8_t *) get_data_ptr (dst, x, y);
+
+  for (j = 0; j < height; j++)
+    {
+      for (i = 0; i < width; i++)
+        {
+          grub_uint32_t color;
+          unsigned int sr;
+          unsigned int sg;
+          unsigned int sb;
+          unsigned int a;
+          unsigned int dr;
+          unsigned int dg;
+          unsigned int db;
+
+          color = *srcptr++;
+
+          a = color >> 24;
+
+          if (a == 0)
+            {
+              /* Skip transparent source pixels.  */
+              dstptr += 3;
+              continue;
+            }
+
+          sr = (color >> 0) & 0xFF;
+          sg = (color >> 8) & 0xFF;
+          sb = (color >> 16) & 0xFF;
+
+          if (a == 255)
+            {
+              /* Opaque pixel shortcut.  */
+              dr = sr;
+              dg = sg;
+              db = sb;
+            }
+          else
+            {
+              /* General pixel color blending.  */
+              color = *dstptr;
+
+              db = dstptr[0];
+              db = (db * (255 - a) + sb * a) / 255;
+              dg = dstptr[1];
+              dg = (dg * (255 - a) + sg * a) / 255;
+              dr = dstptr[2];
+              dr = (dr * (255 - a) + sr * a) / 255;
+            }
+
+          *dstptr++ = db;
+          *dstptr++ = dg;
+          *dstptr++ = dr;
+        }
+
+      srcptr = (grub_uint32_t *) (((grub_uint8_t *) srcptr) + srcrowskip);
+      dstptr += dstrowskip;
+    }
+}
+
+/* Optimized blending blitter for RGBA888 to RGBA8888.  */
+void
+grub_video_i386_vbeblit_blend_RGBA8888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                                struct 
grub_video_i386_vbeblit_info *src,
+                                                int x, int y,
+                                                int width, int height,
+                                                int offset_x, int offset_y)
+{
+  grub_uint32_t color;
+  int i;
+  int j;
+  grub_uint32_t *srcptr;
+  grub_uint32_t *dstptr;
+  unsigned int sr;
+  unsigned int sg;
+  unsigned int sb;
+  unsigned int a;
+  unsigned int dr;
+  unsigned int dg;
+  unsigned int db;
+
+  for (j = 0; j < height; j++)
+    {
+      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
+      dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j);
+
+      for (i = 0; i < width; i++)
+        {
+          color = *srcptr++;
+
+          a = color >> 24;
+
+          if (a == 0)
+            {
+              dstptr++;
+              continue;
+            }
+
+          if (a == 255)
+            {
+              *dstptr++ = color;
+              continue;
+            }
+
+          sr = (color >> 0) & 0xFF;
+          sg = (color >> 8) & 0xFF;
+          sb = (color >> 16) & 0xFF;
+
+          color = *dstptr;
+
+          dr = (color >> 0) & 0xFF;
+          dg = (color >> 8) & 0xFF;
+          db = (color >> 16) & 0xFF;
+
+          dr = (dr * (255 - a) + sr * a) / 255;
+          dg = (dg * (255 - a) + sg * a) / 255;
+          db = (db * (255 - a) + sb * a) / 255;
+
+          color = (a << 24) | (db << 16) | (dg << 8) | dr;
+
+          *dstptr++ = color;
+        }
+    }
+}
+
+/* Optimized blending blitter for RGBA8888 to RGB888.  */
+void
+grub_video_i386_vbeblit_blend_RGB888_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                              struct 
grub_video_i386_vbeblit_info *src,
+                                              int x, int y,
+                                              int width, int height,
+                                              int offset_x, int offset_y)
+{
+  grub_uint32_t color;
+  int i;
+  int j;
+  grub_uint32_t *srcptr;
+  grub_uint8_t *dstptr;
+  unsigned int sr;
+  unsigned int sg;
+  unsigned int sb;
+  unsigned int a;
+  unsigned int dr;
+  unsigned int dg;
+  unsigned int db;
+
+  for (j = 0; j < height; j++)
+    {
+      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
+      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
+
+      for (i = 0; i < width; i++)
+        {
+          color = *srcptr++;
+
+          a = color >> 24;
+
+          if (a == 0)
+            {
+              dstptr += 3;
+              continue;
+            }
+
+          sr = (color >> 0) & 0xFF;
+          sg = (color >> 8) & 0xFF;
+          sb = (color >> 16) & 0xFF;
+
+          if (a == 255)
+            {
+              *dstptr++ = sr;
+              *dstptr++ = sg;
+              *dstptr++ = sb;
+
+              continue;
+            }
+
+          dr = dstptr[0];
+          dg = dstptr[1];
+          db = dstptr[2];
+
+          dr = (dr * (255 - a) + sr * a) / 255;
+          dg = (dg * (255 - a) + sg * a) / 255;
+          db = (db * (255 - a) + sb * a) / 255;
+
+          *dstptr++ = dr;
+          *dstptr++ = dg;
+          *dstptr++ = db;
+        }
+    }
+}
+
+/* Optimized blending blitter for RGBA8888 to indexed color.  */
+void
+grub_video_i386_vbeblit_blend_index_RGBA8888 (struct 
grub_video_i386_vbeblit_info *dst,
+                                             struct 
grub_video_i386_vbeblit_info *src,
+                                             int x, int y,
+                                             int width, int height,
+                                             int offset_x, int offset_y)
+{
+  grub_uint32_t color;
+  int i;
+  int j;
+  grub_uint32_t *srcptr;
+  grub_uint8_t *dstptr;
+  unsigned int sr;
+  unsigned int sg;
+  unsigned int sb;
+  unsigned int a;
+  unsigned char dr;
+  unsigned char dg;
+  unsigned char db;
+  unsigned char da;
+
+  for (j = 0; j < height; j++)
+    {
+      srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);
+      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);
+
+      for (i = 0; i < width; i++)
+        {
+          color = *srcptr++;
+
+          a = color >> 24;
+
+          if (a == 0)
+            {
+              dstptr++;
+              continue;
+            }
+
+          sr = (color >> 0) & 0xFF;
+          sg = (color >> 8) & 0xFF;
+          sb = (color >> 16) & 0xFF;
+
+          if (a == 255)
+            {
+              color = grub_video_vbe_map_rgb(sr, sg, sb);
+              *dstptr++ = color & 0xFF;
+              continue;
+            }
+
+          grub_video_vbe_unmap_color_int (dst, *dstptr, &dr, &dg, &db, &da);
+
+          dr = (dr * (255 - a) + sr * a) / 255;
+          dg = (dg * (255 - a) + sg * a) / 255;
+          db = (db * (255 - a) + sb * a) / 255;
+
+          color = grub_video_vbe_map_rgb(dr, dg, db);
+
+          *dstptr++ = color & 0xFF;
+        }
+    }
+}

Modified: trunk/grub2/video/i386/pc/vbefill.c
===================================================================
--- trunk/grub2/video/i386/pc/vbefill.c 2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/i386/pc/vbefill.c 2008-09-07 15:55:58 UTC (rev 1856)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2006,2007  Free Software Foundation, Inc.
+ *  Copyright (C) 2006,2007,2008  Free Software Foundation, Inc.
  *
  *  GRUB is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -33,89 +33,145 @@
 #include <grub/types.h>
 #include <grub/video.h>
 
+/* Generic filler that works for every supported mode.  */
 void
-grub_video_i386_vbefill_R8G8B8A8 (struct grub_video_i386_vbeblit_info *dst,
+grub_video_i386_vbefill (struct grub_video_i386_vbeblit_info *dst,
+                         grub_video_color_t color, int x, int y,
+                         int width, int height)
+{
+  int i;
+  int j;
+
+  for (j = 0; j < height; j++)
+    for (i = 0; i < width; i++)
+      set_pixel (dst, x+i, y+j, color);
+}
+
+/* Optimized filler for direct color 32 bit modes.  It is assumed that color
+   is already mapped to destination format.  */
+void
+grub_video_i386_vbefill_direct32 (struct grub_video_i386_vbeblit_info *dst,
                                   grub_video_color_t color, int x, int y,
                                   int width, int height)
 {
   int i;
   int j;
   grub_uint32_t *dstptr;
+  grub_size_t rowskip;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  /* Get the start address.  */
+  dstptr = (grub_uint32_t *) grub_video_vbe_get_video_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
     {
-      dstptr = (grub_uint32_t *)grub_video_vbe_get_video_ptr (dst, x, y + j);
-
       for (i = 0; i < width; i++)
         *dstptr++ = color;
+
+      /* Advance the dest pointer to the right location on the next line.  */
+      dstptr = (grub_uint32_t *) (((char *) dstptr) + rowskip);
     }
 }
 
+/* Optimized filler for direct color 24 bit modes.  It is assumed that color
+   is already mapped to destination format.  */
 void
-grub_video_i386_vbefill_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,
-                                grub_video_color_t color, int x, int y,
-                                int width, int height)
+grub_video_i386_vbefill_direct24 (struct grub_video_i386_vbeblit_info *dst,
+                                  grub_video_color_t color, int x, int y,
+                                  int width, int height)
 {
   int i;
   int j;
+  grub_size_t rowskip;
   grub_uint8_t *dstptr;
-  grub_uint8_t fillr = (grub_uint8_t)((color >> 0) & 0xFF);
-  grub_uint8_t fillg = (grub_uint8_t)((color >> 8) & 0xFF);
-  grub_uint8_t fillb = (grub_uint8_t)((color >> 16) & 0xFF);
+  grub_uint8_t fill0 = (grub_uint8_t)((color >> 0) & 0xFF);
+  grub_uint8_t fill1 = (grub_uint8_t)((color >> 8) & 0xFF);
+  grub_uint8_t fill2 = (grub_uint8_t)((color >> 16) & 0xFF);
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  /* Get the start address.  */
+  dstptr = (grub_uint8_t *) grub_video_vbe_get_video_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
     {
-      dstptr = (grub_uint8_t *)grub_video_vbe_get_video_ptr (dst, x, y + j);
-
       for (i = 0; i < width; i++)
         {
-          *dstptr++ = fillr;
-          *dstptr++ = fillg;
-          *dstptr++ = fillb;
+          *dstptr++ = fill0;
+          *dstptr++ = fill1;
+          *dstptr++ = fill2;
         }
+
+      /* Advance the dest pointer to the right location on the next line.  */
+      dstptr += rowskip;
     }
 }
 
+/* Optimized filler for direct color 16 bit modes.  It is assumed that color
+   is already mapped to destination format.  */
 void
-grub_video_i386_vbefill_index (struct grub_video_i386_vbeblit_info *dst,
-                               grub_video_color_t color, int x, int y,
-                               int width, int height)
+grub_video_i386_vbefill_direct16 (struct grub_video_i386_vbeblit_info *dst,
+                                  grub_video_color_t color, int x, int y,
+                                  int width, int height)
 {
   int i;
   int j;
+  grub_size_t rowskip;
   grub_uint8_t *dstptr;
-  grub_uint8_t fill = (grub_uint8_t)color & 0xFF;
+  grub_uint8_t fill0 = (grub_uint8_t)((color >> 0) & 0xFF);
+  grub_uint8_t fill1 = (grub_uint8_t)((color >> 8) & 0xFF);
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  /* Get the start address.  */
+  dstptr = (grub_uint8_t *) grub_video_vbe_get_video_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
     {
-      dstptr = (grub_uint8_t *)grub_video_vbe_get_video_ptr (dst, x, y + j);
+      for (i = 0; i < width; i++)
+        {
+          *dstptr++ = fill0;
+          *dstptr++ = fill1;
+        }
 
-      for (i = 0; i < width; i++)
-        *dstptr++ = fill;
+      /* Advance the dest pointer to the right location on the next line.  */
+      dstptr += rowskip;
     }
 }
 
+/* Optimized filler for index color.  It is assumed that color
+   is already mapped to destination format.  */
 void
-grub_video_i386_vbefill (struct grub_video_i386_vbeblit_info *dst,
-                         grub_video_color_t color, int x, int y,
-                         int width, int height)
+grub_video_i386_vbefill_direct8 (struct grub_video_i386_vbeblit_info *dst,
+                                grub_video_color_t color, int x, int y,
+                                int width, int height)
 {
   int i;
   int j;
+  grub_size_t rowskip;
+  grub_uint8_t *dstptr;
+  grub_uint8_t fill = (grub_uint8_t)color & 0xFF;
 
-  /* We do not need to worry about data being out of bounds
-     as we assume that everything has been checked before.  */
+  /* Calculate the number of bytes to advance from the end of one line
+     to the beginning of the next line.  */
+  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
 
+  /* Get the start address.  */
+  dstptr = (grub_uint8_t *) grub_video_vbe_get_video_ptr (dst, x, y);
+
   for (j = 0; j < height; j++)
-    for (i = 0; i < width; i++)
-      set_pixel (dst, x+i, y+j, color);
+    {
+      for (i = 0; i < width; i++)
+        *dstptr++ = fill;
+
+      /* Advance the dest pointer to the right location on the next line.  */
+      dstptr += rowskip;
+    }
 }

Modified: trunk/grub2/video/readers/jpeg.c
===================================================================
--- trunk/grub2/video/readers/jpeg.c    2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/readers/jpeg.c    2008-09-07 15:55:58 UTC (rev 1856)
@@ -542,7 +542,7 @@
 
   if (grub_video_bitmap_create (data->bitmap, data->image_width,
                                data->image_height,
-                               GRUB_VIDEO_BLIT_FORMAT_R8G8B8))
+                               GRUB_VIDEO_BLIT_FORMAT_RGB_888))
     return grub_errno;
 
   data->bit_mask = 0x0;

Modified: trunk/grub2/video/readers/png.c
===================================================================
--- trunk/grub2/video/readers/png.c     2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/readers/png.c     2008-09-07 15:55:58 UTC (rev 1856)
@@ -231,7 +231,7 @@
     {
       if (grub_video_bitmap_create (data->bitmap, data->image_width,
                                    data->image_height,
-                                   GRUB_VIDEO_BLIT_FORMAT_R8G8B8))
+                                   GRUB_VIDEO_BLIT_FORMAT_RGB_888))
        return grub_errno;
       data->bpp = 3;
     }
@@ -239,7 +239,7 @@
     {
       if (grub_video_bitmap_create (data->bitmap, data->image_width,
                                    data->image_height,
-                                   GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8))
+                                   GRUB_VIDEO_BLIT_FORMAT_RGBA_8888))
        return grub_errno;
       data->bpp = 4;
     }

Modified: trunk/grub2/video/readers/tga.c
===================================================================
--- trunk/grub2/video/readers/tga.c     2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/readers/tga.c     2008-09-07 15:55:58 UTC (rev 1856)
@@ -397,7 +397,7 @@
     {
       grub_video_bitmap_create (bitmap, header.image_width,
                                 header.image_height,
-                                GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8);
+                                GRUB_VIDEO_BLIT_FORMAT_RGBA_8888);
       if (grub_errno != GRUB_ERR_NONE)
         {
           grub_file_close (file);
@@ -420,7 +420,7 @@
     {
       grub_video_bitmap_create (bitmap, header.image_width,
                                 header.image_height,
-                                GRUB_VIDEO_BLIT_FORMAT_R8G8B8);
+                                GRUB_VIDEO_BLIT_FORMAT_RGB_888);
       if (grub_errno != GRUB_ERR_NONE)
         {
           grub_file_close (file);

Modified: trunk/grub2/video/video.c
===================================================================
--- trunk/grub2/video/video.c   2008-09-06 13:56:15 UTC (rev 1855)
+++ trunk/grub2/video/video.c   2008-09-07 15:55:58 UTC (rev 1856)
@@ -108,7 +108,7 @@
     }
 
   /* We couldn't find suitable adapter for specified mode.  */
-  return grub_error (GRUB_ERR_UNKNOWN_DEVICE, 
+  return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
                      "Can't locate valid adapter for mode");
 }
 
@@ -140,7 +140,7 @@
       grub_errno = GRUB_ERR_NONE;
       return grub_errno;
     }
-  
+
   return grub_video_adapter_active->get_info (mode_info);
 }
 
@@ -152,40 +152,82 @@
   if (mode_info->bpp == 32)
     {
       if ((mode_info->red_mask_size == 8)
-          && (mode_info->red_field_pos == 0)
-          && (mode_info->green_mask_size == 8)
-          && (mode_info->green_field_pos == 8)
-          && (mode_info->blue_mask_size == 8)
-          && (mode_info->blue_field_pos == 16)
-          && (mode_info->reserved_mask_size == 8)
-          && (mode_info->reserved_field_pos == 24))
-        {
-          return GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8;
-        }
+         && (mode_info->red_field_pos == 16)
+         && (mode_info->green_mask_size == 8)
+         && (mode_info->green_field_pos == 8)
+         && (mode_info->blue_mask_size == 8)
+         && (mode_info->blue_field_pos == 0))
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_BGRA_8888;
+       }
+      else if ((mode_info->red_mask_size == 8)
+              && (mode_info->red_field_pos == 0)
+              && (mode_info->green_mask_size == 8)
+              && (mode_info->green_field_pos == 8)
+              && (mode_info->blue_mask_size == 8)
+              && (mode_info->blue_field_pos == 16))
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_RGBA_8888;
+       }
     }
-
   /* Check if we have any known 24 bit modes.  */
-  if (mode_info->bpp == 24)
+  else if (mode_info->bpp == 24)
     {
       if ((mode_info->red_mask_size == 8)
-          && (mode_info->red_field_pos == 0)
-          && (mode_info->green_mask_size == 8)
-          && (mode_info->green_field_pos == 8)
-          && (mode_info->blue_mask_size == 8)
-          && (mode_info->blue_field_pos == 16))
-        {
-          return GRUB_VIDEO_BLIT_FORMAT_R8G8B8;
-        }
+         && (mode_info->red_field_pos == 16)
+         && (mode_info->green_mask_size == 8)
+         && (mode_info->green_field_pos == 8)
+         && (mode_info->blue_mask_size == 8)
+         && (mode_info->blue_field_pos == 0))
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_BGR_888;
+       }
+      else if ((mode_info->red_mask_size == 8)
+              && (mode_info->red_field_pos == 0)
+              && (mode_info->green_mask_size == 8)
+              && (mode_info->green_field_pos == 8)
+              && (mode_info->blue_mask_size == 8)
+              && (mode_info->blue_field_pos == 16))
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_RGB_888;
+       }
     }
+  /* Check if we have any known 16 bit modes.  */
+  else if (mode_info->bpp == 16)
+    {
+      if ((mode_info->red_mask_size == 5)
+         && (mode_info->red_field_pos == 11)
+         && (mode_info->green_mask_size == 6)
+         && (mode_info->green_field_pos == 5)
+         && (mode_info->blue_mask_size == 5)
+         && (mode_info->blue_field_pos == 0))
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_BGR_565;
+       }
+      else if ((mode_info->red_mask_size == 5)
+              && (mode_info->red_field_pos == 0)
+              && (mode_info->green_mask_size == 6)
+              && (mode_info->green_field_pos == 5)
+              && (mode_info->blue_mask_size == 5)
+              && (mode_info->blue_field_pos == 11))
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_RGB_565;
+       }
+    }
 
+  /* Backup route.  Unknown format.  */
+
   /* If there are more than 8 bits per color, assume RGB(A) mode.  */
   if (mode_info->bpp > 8)
     {
       if (mode_info->reserved_mask_size > 0)
-        {
-          return GRUB_VIDEO_BLIT_FORMAT_RGBA;
-        }
-      return GRUB_VIDEO_BLIT_FORMAT_RGB;
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_RGBA;
+       }
+      else
+       {
+         return GRUB_VIDEO_BLIT_FORMAT_RGB;
+       }
     }
 
   /* Assume as indexcolor mode.  */
@@ -269,8 +311,8 @@
 
 /* Unmap video color back to RGBA components.  */
 grub_err_t
-grub_video_unmap_color (grub_video_color_t color, grub_uint8_t *red, 
-                        grub_uint8_t *green, grub_uint8_t *blue, 
+grub_video_unmap_color (grub_video_color_t color, grub_uint8_t *red,
+                        grub_uint8_t *green, grub_uint8_t *blue,
                         grub_uint8_t *alpha)
 {
   if (! grub_video_adapter_active)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]