2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2006,2007,2008,2009 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/>.
19 #ifndef GRUB_VIDEO_HEADER
20 #define GRUB_VIDEO_HEADER 1
23 #include <grub/types.h>
25 /* Video color in hardware dependent format. Users should not assume any
26 specific coding format. */
27 typedef grub_uint32_t grub_video_color_t
;
29 /* This structure is driver specific and should not be accessed directly by
31 struct grub_video_render_target
;
33 /* Forward declarations for used data structures. */
34 struct grub_video_bitmap
;
36 /* Defines used to describe video mode or rendering target. */
37 #define GRUB_VIDEO_MODE_TYPE_PURE_TEXT 0x00000040
38 #define GRUB_VIDEO_MODE_TYPE_ALPHA 0x00000020
39 #define GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED 0x00000010
40 #define GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP 0x00000004
41 #define GRUB_VIDEO_MODE_TYPE_INDEX_COLOR 0x00000002
42 #define GRUB_VIDEO_MODE_TYPE_RGB 0x00000001
44 /* Defines used to mask flags. */
45 #define GRUB_VIDEO_MODE_TYPE_COLOR_MASK 0x0000000F
47 /* Defines used to specify requested bit depth. */
48 #define GRUB_VIDEO_MODE_TYPE_DEPTH_MASK 0x0000ff00
49 #define GRUB_VIDEO_MODE_TYPE_DEPTH_POS 8
51 #define GRUB_VIDEO_RENDER_TARGET_DISPLAY \
52 ((struct grub_video_render_target *) 0)
54 /* Defined blitting formats. */
55 enum grub_video_blit_format
57 /* Generic RGBA, use fields & masks. */
58 GRUB_VIDEO_BLIT_FORMAT_RGBA
,
60 /* Optimized RGBA's. */
61 GRUB_VIDEO_BLIT_FORMAT_RGBA_8888
,
62 GRUB_VIDEO_BLIT_FORMAT_BGRA_8888
,
64 /* Generic RGB, use fields & masks. */
65 GRUB_VIDEO_BLIT_FORMAT_RGB
,
67 /* Optimized RGB's. */
68 GRUB_VIDEO_BLIT_FORMAT_RGB_888
,
69 GRUB_VIDEO_BLIT_FORMAT_BGR_888
,
70 GRUB_VIDEO_BLIT_FORMAT_RGB_565
,
71 GRUB_VIDEO_BLIT_FORMAT_BGR_565
,
73 /* When needed, decode color or just use value as is. */
74 GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR
,
76 /* Two color bitmap; bits packed: rows are not padded to byte boundary. */
77 GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED
80 /* Define blitting operators. */
81 enum grub_video_blit_operators
83 /* Replace target bitmap data with source. */
84 GRUB_VIDEO_BLIT_REPLACE
,
85 /* Blend target and source based on source's alpha value. */
89 struct grub_video_mode_info
91 /* Width of the screen. */
94 /* Height of the screen. */
97 /* Mode type bitmask. Contains information like is it Index color or
99 unsigned int mode_type
;
101 /* Bits per pixel. */
104 /* Bytes per pixel. */
105 unsigned int bytes_per_pixel
;
107 /* Pitch of one scanline. How many bytes there are for scanline. */
110 /* In index color mode, number of colors. In RGB mode this is 256. */
111 unsigned int number_of_colors
;
113 /* Optimization hint how binary data is coded. */
114 enum grub_video_blit_format blit_format
;
116 /* How many bits are reserved for red color. */
117 unsigned int red_mask_size
;
119 /* What is location of red color bits. In Index Color mode, this is 0. */
120 unsigned int red_field_pos
;
122 /* How many bits are reserved for green color. */
123 unsigned int green_mask_size
;
125 /* What is location of green color bits. In Index Color mode, this is 0. */
126 unsigned int green_field_pos
;
128 /* How many bits are reserved for blue color. */
129 unsigned int blue_mask_size
;
131 /* What is location of blue color bits. In Index Color mode, this is 0. */
132 unsigned int blue_field_pos
;
134 /* How many bits are reserved in color. */
135 unsigned int reserved_mask_size
;
137 /* What is location of reserved color bits. In Index Color mode,
139 unsigned int reserved_field_pos
;
141 /* For 1-bit bitmaps, the background color. Used for bits = 0. */
143 grub_uint8_t bg_green
;
144 grub_uint8_t bg_blue
;
145 grub_uint8_t bg_alpha
;
147 /* For 1-bit bitmaps, the foreground color. Used for bits = 1. */
149 grub_uint8_t fg_green
;
150 grub_uint8_t fg_blue
;
151 grub_uint8_t fg_alpha
;
154 struct grub_video_palette_data
156 grub_uint8_t r
; /* Red color value (0-255). */
157 grub_uint8_t g
; /* Green color value (0-255). */
158 grub_uint8_t b
; /* Blue color value (0-255). */
159 grub_uint8_t a
; /* Reserved bits value (0-255). */
162 struct grub_video_adapter
164 /* The video adapter name. */
167 /* Initialize the video adapter. */
168 grub_err_t (*init
) (void);
170 /* Clean up the video adapter. */
171 grub_err_t (*fini
) (void);
173 grub_err_t (*setup
) (unsigned int width
, unsigned int height
,
174 unsigned int mode_type
);
176 grub_err_t (*get_info
) (struct grub_video_mode_info
*mode_info
);
178 grub_err_t (*get_info_and_fini
) (struct grub_video_mode_info
*mode_info
,
181 grub_err_t (*set_palette
) (unsigned int start
, unsigned int count
,
182 struct grub_video_palette_data
*palette_data
);
184 grub_err_t (*get_palette
) (unsigned int start
, unsigned int count
,
185 struct grub_video_palette_data
*palette_data
);
187 grub_err_t (*set_viewport
) (unsigned int x
, unsigned int y
,
188 unsigned int width
, unsigned int height
);
190 grub_err_t (*get_viewport
) (unsigned int *x
, unsigned int *y
,
191 unsigned int *width
, unsigned int *height
);
193 grub_video_color_t (*map_color
) (grub_uint32_t color_name
);
195 grub_video_color_t (*map_rgb
) (grub_uint8_t red
, grub_uint8_t green
,
198 grub_video_color_t (*map_rgba
) (grub_uint8_t red
, grub_uint8_t green
,
199 grub_uint8_t blue
, grub_uint8_t alpha
);
201 grub_err_t (*unmap_color
) (grub_video_color_t color
,
202 grub_uint8_t
*red
, grub_uint8_t
*green
,
203 grub_uint8_t
*blue
, grub_uint8_t
*alpha
);
205 grub_err_t (*fill_rect
) (grub_video_color_t color
, int x
, int y
,
206 unsigned int width
, unsigned int height
);
208 grub_err_t (*blit_bitmap
) (struct grub_video_bitmap
*bitmap
,
209 enum grub_video_blit_operators oper
,
210 int x
, int y
, int offset_x
, int offset_y
,
211 unsigned int width
, unsigned int height
);
213 grub_err_t (*blit_render_target
) (struct grub_video_render_target
*source
,
214 enum grub_video_blit_operators oper
,
215 int x
, int y
, int offset_x
, int offset_y
,
216 unsigned int width
, unsigned int height
);
218 grub_err_t (*scroll
) (grub_video_color_t color
, int dx
, int dy
);
220 grub_err_t (*swap_buffers
) (void);
222 grub_err_t (*create_render_target
) (struct grub_video_render_target
**result
,
223 unsigned int width
, unsigned int height
,
224 unsigned int mode_type
);
226 grub_err_t (*delete_render_target
) (struct grub_video_render_target
*target
);
228 grub_err_t (*set_active_render_target
) (struct grub_video_render_target
*target
);
230 grub_err_t (*get_active_render_target
) (struct grub_video_render_target
**target
);
232 /* The next video adapter. */
233 struct grub_video_adapter
*next
;
235 typedef struct grub_video_adapter
*grub_video_adapter_t
;
237 void grub_video_register (grub_video_adapter_t adapter
);
238 void grub_video_unregister (grub_video_adapter_t adapter
);
239 void grub_video_iterate (int (*hook
) (grub_video_adapter_t adapter
));
241 grub_err_t
grub_video_restore (void);
243 grub_err_t
grub_video_get_info (struct grub_video_mode_info
*mode_info
);
245 /* Framebuffer address may change as a part of normal operation
246 (e.g. double buffering). That's why you need to stop video subsystem to be
247 sure that framebuffer address doesn't change. To ensure this abstraction
248 grub_video_get_info_and_fini is the only function supplying framebuffer
250 grub_err_t
grub_video_get_info_and_fini (struct grub_video_mode_info
*mode_info
,
253 enum grub_video_blit_format
grub_video_get_blit_format (struct grub_video_mode_info
*mode_info
);
255 grub_err_t
grub_video_set_palette (unsigned int start
, unsigned int count
,
256 struct grub_video_palette_data
*palette_data
);
258 grub_err_t
grub_video_get_palette (unsigned int start
, unsigned int count
,
259 struct grub_video_palette_data
*palette_data
);
261 grub_err_t
grub_video_set_viewport (unsigned int x
, unsigned int y
,
262 unsigned int width
, unsigned int height
);
264 grub_err_t
grub_video_get_viewport (unsigned int *x
, unsigned int *y
,
265 unsigned int *width
, unsigned int *height
);
267 grub_video_color_t
grub_video_map_color (grub_uint32_t color_name
);
269 grub_video_color_t
grub_video_map_rgb (grub_uint8_t red
, grub_uint8_t green
,
272 grub_video_color_t
grub_video_map_rgba (grub_uint8_t red
, grub_uint8_t green
,
273 grub_uint8_t blue
, grub_uint8_t alpha
);
275 grub_err_t
grub_video_unmap_color (grub_video_color_t color
,
276 grub_uint8_t
*red
, grub_uint8_t
*green
,
277 grub_uint8_t
*blue
, grub_uint8_t
*alpha
);
279 grub_err_t
grub_video_fill_rect (grub_video_color_t color
, int x
, int y
,
280 unsigned int width
, unsigned int height
);
282 grub_err_t
grub_video_blit_bitmap (struct grub_video_bitmap
*bitmap
,
283 enum grub_video_blit_operators oper
,
284 int x
, int y
, int offset_x
, int offset_y
,
285 unsigned int width
, unsigned int height
);
287 grub_err_t
grub_video_blit_render_target (struct grub_video_render_target
*source
,
288 enum grub_video_blit_operators oper
,
290 int offset_x
, int offset_y
,
292 unsigned int height
);
294 grub_err_t
grub_video_scroll (grub_video_color_t color
, int dx
, int dy
);
296 grub_err_t
grub_video_swap_buffers (void);
298 grub_err_t
grub_video_create_render_target (struct grub_video_render_target
**result
,
301 unsigned int mode_type
);
303 grub_err_t
grub_video_delete_render_target (struct grub_video_render_target
*target
);
305 grub_err_t
grub_video_set_active_render_target (struct grub_video_render_target
*target
);
307 grub_err_t
grub_video_get_active_render_target (struct grub_video_render_target
**target
);
309 grub_err_t
grub_video_set_mode (const char *modestring
,
310 int NESTED_FUNC_ATTR (*hook
) (grub_video_adapter_t p
,
311 struct grub_video_mode_info
*mode_info
));
313 #endif /* ! GRUB_VIDEO_HEADER */