2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
21 Please note following when reading the code below:
23 - In this driver we assume that every memory can be accessed by same memory
24 bus. If there are different address spaces do not use this code as a base
27 - Every function in this code assumes that bounds checking has been done in
28 previous phase and they are opted out in here. */
30 #include <grub/machine/vbe.h>
31 #include <grub/machine/vbefill.h>
32 #include <grub/machine/vbeutil.h>
33 #include <grub/types.h>
34 #include <grub/video.h>
36 /* Generic filler that works for every supported mode. */
38 grub_video_i386_vbefill (struct grub_video_i386_vbeblit_info
*dst
,
39 grub_video_color_t color
, int x
, int y
,
40 int width
, int height
)
45 for (j
= 0; j
< height
; j
++)
46 for (i
= 0; i
< width
; i
++)
47 set_pixel (dst
, x
+i
, y
+j
, color
);
50 /* Optimized filler for direct color 32 bit modes. It is assumed that color
51 is already mapped to destination format. */
53 grub_video_i386_vbefill_direct32 (struct grub_video_i386_vbeblit_info
*dst
,
54 grub_video_color_t color
, int x
, int y
,
55 int width
, int height
)
59 grub_uint32_t
*dstptr
;
62 /* Calculate the number of bytes to advance from the end of one line
63 to the beginning of the next line. */
64 rowskip
= dst
->mode_info
->pitch
- dst
->mode_info
->bytes_per_pixel
* width
;
66 /* Get the start address. */
67 dstptr
= (grub_uint32_t
*) grub_video_vbe_get_video_ptr (dst
, x
, y
);
69 for (j
= 0; j
< height
; j
++)
71 for (i
= 0; i
< width
; i
++)
74 /* Advance the dest pointer to the right location on the next line. */
75 dstptr
= (grub_uint32_t
*) (((char *) dstptr
) + rowskip
);
79 /* Optimized filler for direct color 24 bit modes. It is assumed that color
80 is already mapped to destination format. */
82 grub_video_i386_vbefill_direct24 (struct grub_video_i386_vbeblit_info
*dst
,
83 grub_video_color_t color
, int x
, int y
,
84 int width
, int height
)
90 grub_uint8_t fill0
= (grub_uint8_t
)((color
>> 0) & 0xFF);
91 grub_uint8_t fill1
= (grub_uint8_t
)((color
>> 8) & 0xFF);
92 grub_uint8_t fill2
= (grub_uint8_t
)((color
>> 16) & 0xFF);
94 /* Calculate the number of bytes to advance from the end of one line
95 to the beginning of the next line. */
96 rowskip
= dst
->mode_info
->pitch
- dst
->mode_info
->bytes_per_pixel
* width
;
98 /* Get the start address. */
99 dstptr
= (grub_uint8_t
*) grub_video_vbe_get_video_ptr (dst
, x
, y
);
101 for (j
= 0; j
< height
; j
++)
103 for (i
= 0; i
< width
; i
++)
110 /* Advance the dest pointer to the right location on the next line. */
115 /* Optimized filler for direct color 16 bit modes. It is assumed that color
116 is already mapped to destination format. */
118 grub_video_i386_vbefill_direct16 (struct grub_video_i386_vbeblit_info
*dst
,
119 grub_video_color_t color
, int x
, int y
,
120 int width
, int height
)
125 grub_uint8_t
*dstptr
;
126 grub_uint8_t fill0
= (grub_uint8_t
)((color
>> 0) & 0xFF);
127 grub_uint8_t fill1
= (grub_uint8_t
)((color
>> 8) & 0xFF);
129 /* Calculate the number of bytes to advance from the end of one line
130 to the beginning of the next line. */
131 rowskip
= dst
->mode_info
->pitch
- dst
->mode_info
->bytes_per_pixel
* width
;
133 /* Get the start address. */
134 dstptr
= (grub_uint8_t
*) grub_video_vbe_get_video_ptr (dst
, x
, y
);
136 for (j
= 0; j
< height
; j
++)
138 for (i
= 0; i
< width
; i
++)
144 /* Advance the dest pointer to the right location on the next line. */
149 /* Optimized filler for index color. It is assumed that color
150 is already mapped to destination format. */
152 grub_video_i386_vbefill_direct8 (struct grub_video_i386_vbeblit_info
*dst
,
153 grub_video_color_t color
, int x
, int y
,
154 int width
, int height
)
159 grub_uint8_t
*dstptr
;
160 grub_uint8_t fill
= (grub_uint8_t
)color
& 0xFF;
162 /* Calculate the number of bytes to advance from the end of one line
163 to the beginning of the next line. */
164 rowskip
= dst
->mode_info
->pitch
- dst
->mode_info
->bytes_per_pixel
* width
;
166 /* Get the start address. */
167 dstptr
= (grub_uint8_t
*) grub_video_vbe_get_video_ptr (dst
, x
, y
);
169 for (j
= 0; j
< height
; j
++)
171 for (i
= 0; i
< width
; i
++)
174 /* Advance the dest pointer to the right location on the next line. */