Upgraded GRUB2 to 2.00 release.
[AROS.git] / arch / all-pc / boot / grub2-aros / include / grub / video.h
blob08f730091da50a051f13f250054bb69aaa8fc878
1 /*
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
22 #include <grub/err.h>
23 #include <grub/types.h>
24 #include <grub/list.h>
26 /* Video color in hardware dependent format. Users should not assume any
27 specific coding format. */
28 typedef grub_uint32_t grub_video_color_t;
30 /* Video color in hardware independent format. */
31 typedef struct grub_video_rgba_color
33 grub_uint8_t red;
34 grub_uint8_t green;
35 grub_uint8_t blue;
36 grub_uint8_t alpha;
37 } grub_video_rgba_color_t;
39 /* This structure is driver specific and should not be accessed directly by
40 outside code. */
41 struct grub_video_render_target;
43 /* Forward declarations for used data structures. */
44 struct grub_video_bitmap;
46 /* Defines used to describe video mode or rendering target. */
47 /* If following is set render target contains currenly displayed image
48 after swapping buffers (otherwise it contains previously displayed image).
50 typedef enum grub_video_mode_type
52 GRUB_VIDEO_MODE_TYPE_RGB = 0x00000001,
53 GRUB_VIDEO_MODE_TYPE_INDEX_COLOR = 0x00000002,
54 GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP = 0x00000004,
55 GRUB_VIDEO_MODE_TYPE_YUV = 0x00000008,
57 /* Defines used to mask flags. */
58 GRUB_VIDEO_MODE_TYPE_COLOR_MASK = 0x0000000F,
60 GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED = 0x00000010,
61 GRUB_VIDEO_MODE_TYPE_ALPHA = 0x00000020,
62 GRUB_VIDEO_MODE_TYPE_PURE_TEXT = 0x00000040,
63 GRUB_VIDEO_MODE_TYPE_UPDATING_SWAP = 0x00000080,
64 GRUB_VIDEO_MODE_TYPE_OPERATIONAL_MASK = 0x000000F0,
66 /* Defines used to specify requested bit depth. */
67 GRUB_VIDEO_MODE_TYPE_DEPTH_MASK = 0x0000FF00,
68 #define GRUB_VIDEO_MODE_TYPE_DEPTH_POS 8
70 GRUB_VIDEO_MODE_TYPE_UNKNOWN = 0x00010000,
71 GRUB_VIDEO_MODE_TYPE_HERCULES = 0x00020000,
72 GRUB_VIDEO_MODE_TYPE_PLANAR = 0x00040000,
73 GRUB_VIDEO_MODE_TYPE_NONCHAIN4 = 0x00080000,
74 GRUB_VIDEO_MODE_TYPE_CGA = 0x00100000,
75 GRUB_VIDEO_MODE_TYPE_INFO_MASK = 0x00FF0000,
76 } grub_video_mode_type_t;
78 /* The basic render target representing the whole display. This always
79 renders to the back buffer when double-buffering is in use. */
80 #define GRUB_VIDEO_RENDER_TARGET_DISPLAY \
81 ((struct grub_video_render_target *) 0)
83 /* Defined blitting formats. */
84 enum grub_video_blit_format
86 /* Generic RGBA, use fields & masks. */
87 GRUB_VIDEO_BLIT_FORMAT_RGBA,
89 /* Optimized RGBA's. */
90 GRUB_VIDEO_BLIT_FORMAT_RGBA_8888,
91 GRUB_VIDEO_BLIT_FORMAT_BGRA_8888,
93 /* Generic RGB, use fields & masks. */
94 GRUB_VIDEO_BLIT_FORMAT_RGB,
96 /* Optimized RGB's. */
97 GRUB_VIDEO_BLIT_FORMAT_RGB_888,
98 GRUB_VIDEO_BLIT_FORMAT_BGR_888,
99 GRUB_VIDEO_BLIT_FORMAT_RGB_565,
100 GRUB_VIDEO_BLIT_FORMAT_BGR_565,
102 /* When needed, decode color or just use value as is. */
103 GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR,
105 /* Two color bitmap; bits packed: rows are not padded to byte boundary. */
106 GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED
109 /* Define blitting operators. */
110 enum grub_video_blit_operators
112 /* Replace target bitmap data with source. */
113 GRUB_VIDEO_BLIT_REPLACE,
114 /* Blend target and source based on source's alpha value. */
115 GRUB_VIDEO_BLIT_BLEND
118 struct grub_video_mode_info
120 /* Width of the screen. */
121 unsigned int width;
123 /* Height of the screen. */
124 unsigned int height;
126 /* Mode type bitmask. Contains information like is it Index color or
127 RGB mode. */
128 grub_video_mode_type_t mode_type;
130 /* Bits per pixel. */
131 unsigned int bpp;
133 /* Bytes per pixel. */
134 unsigned int bytes_per_pixel;
136 /* Pitch of one scanline. How many bytes there are for scanline. */
137 unsigned int pitch;
139 /* In index color mode, number of colors. In RGB mode this is 256. */
140 unsigned int number_of_colors;
142 unsigned int mode_number;
143 #define GRUB_VIDEO_MODE_NUMBER_INVALID 0xffffffff
145 /* Optimization hint how binary data is coded. */
146 enum grub_video_blit_format blit_format;
148 /* How many bits are reserved for red color. */
149 unsigned int red_mask_size;
151 /* What is location of red color bits. In Index Color mode, this is 0. */
152 unsigned int red_field_pos;
154 /* How many bits are reserved for green color. */
155 unsigned int green_mask_size;
157 /* What is location of green color bits. In Index Color mode, this is 0. */
158 unsigned int green_field_pos;
160 /* How many bits are reserved for blue color. */
161 unsigned int blue_mask_size;
163 /* What is location of blue color bits. In Index Color mode, this is 0. */
164 unsigned int blue_field_pos;
166 /* How many bits are reserved in color. */
167 unsigned int reserved_mask_size;
169 /* What is location of reserved color bits. In Index Color mode,
170 this is 0. */
171 unsigned int reserved_field_pos;
173 /* For 1-bit bitmaps, the background color. Used for bits = 0. */
174 grub_uint8_t bg_red;
175 grub_uint8_t bg_green;
176 grub_uint8_t bg_blue;
177 grub_uint8_t bg_alpha;
179 /* For 1-bit bitmaps, the foreground color. Used for bits = 1. */
180 grub_uint8_t fg_red;
181 grub_uint8_t fg_green;
182 grub_uint8_t fg_blue;
183 grub_uint8_t fg_alpha;
186 /* A 2D rectangle type. */
187 struct grub_video_rect
189 unsigned x;
190 unsigned y;
191 unsigned width;
192 unsigned height;
194 typedef struct grub_video_rect grub_video_rect_t;
196 struct grub_video_signed_rect
198 signed x;
199 signed y;
200 unsigned width;
201 unsigned height;
203 typedef struct grub_video_signed_rect grub_video_signed_rect_t;
205 struct grub_video_palette_data
207 grub_uint8_t r; /* Red color value (0-255). */
208 grub_uint8_t g; /* Green color value (0-255). */
209 grub_uint8_t b; /* Blue color value (0-255). */
210 grub_uint8_t a; /* Reserved bits value (0-255). */
213 struct grub_video_edid_info
215 grub_uint8_t header[8];
216 grub_uint16_t manufacturer_id;
217 grub_uint16_t product_id;
218 grub_uint32_t serial_number;
219 grub_uint8_t week_of_manufacture;
220 grub_uint8_t year_of_manufacture;
221 grub_uint8_t version;
222 grub_uint8_t revision;
224 grub_uint8_t video_input_definition;
225 grub_uint8_t max_horizontal_image_size;
226 grub_uint8_t max_vertical_image_size;
227 grub_uint8_t display_gamma;
228 grub_uint8_t feature_support;
229 #define GRUB_VIDEO_EDID_FEATURE_PREFERRED_TIMING_MODE (1 << 1)
231 grub_uint8_t red_green_lo;
232 grub_uint8_t blue_white_lo;
233 grub_uint8_t red_x_hi;
234 grub_uint8_t red_y_hi;
235 grub_uint8_t green_x_hi;
236 grub_uint8_t green_y_hi;
237 grub_uint8_t blue_x_hi;
238 grub_uint8_t blue_y_hi;
239 grub_uint8_t white_x_hi;
240 grub_uint8_t white_y_hi;
242 grub_uint8_t established_timings_1;
243 grub_uint8_t established_timings_2;
244 grub_uint8_t manufacturer_reserved_timings;
246 grub_uint16_t standard_timings[8];
248 struct {
249 grub_uint16_t pixel_clock;
250 /* Only valid if the pixel clock is non-null. */
251 grub_uint8_t horizontal_active_lo;
252 grub_uint8_t horizontal_blanking_lo;
253 grub_uint8_t horizontal_hi;
254 grub_uint8_t vertical_active_lo;
255 grub_uint8_t vertical_blanking_lo;
256 grub_uint8_t vertical_hi;
257 grub_uint8_t horizontal_sync_offset_lo;
258 grub_uint8_t horizontal_sync_pulse_width_lo;
259 grub_uint8_t vertical_sync_lo;
260 grub_uint8_t sync_hi;
261 grub_uint8_t horizontal_image_size_lo;
262 grub_uint8_t vertical_image_size_lo;
263 grub_uint8_t image_size_hi;
264 grub_uint8_t horizontal_border;
265 grub_uint8_t vertical_border;
266 grub_uint8_t flags;
267 } detailed_timings[4];
269 grub_uint8_t extension_flag;
270 grub_uint8_t checksum;
271 } __attribute__ ((packed));
273 typedef enum grub_video_driver_id
275 GRUB_VIDEO_DRIVER_NONE,
276 GRUB_VIDEO_DRIVER_VBE,
277 GRUB_VIDEO_DRIVER_EFI_UGA,
278 GRUB_VIDEO_DRIVER_EFI_GOP,
279 GRUB_VIDEO_DRIVER_SM712,
280 GRUB_VIDEO_DRIVER_VGA,
281 GRUB_VIDEO_DRIVER_CIRRUS,
282 GRUB_VIDEO_DRIVER_BOCHS,
283 GRUB_VIDEO_DRIVER_SDL,
284 GRUB_VIDEO_DRIVER_SIS315PRO,
285 GRUB_VIDEO_DRIVER_RADEON_FULOONG2E,
286 } grub_video_driver_id_t;
288 typedef enum grub_video_adapter_prio
290 GRUB_VIDEO_ADAPTER_PRIO_FALLBACK = 60,
291 GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE_DIRTY = 70,
292 GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE = 80,
293 GRUB_VIDEO_ADAPTER_PRIO_NATIVE = 100
294 } grub_video_adapter_prio_t;
297 struct grub_video_adapter
299 /* The next video adapter. */
300 struct grub_video_adapter *next;
301 struct grub_video_adapter **prev;
303 /* The video adapter name. */
304 const char *name;
305 grub_video_driver_id_t id;
307 grub_video_adapter_prio_t prio;
309 /* Initialize the video adapter. */
310 grub_err_t (*init) (void);
312 /* Clean up the video adapter. */
313 grub_err_t (*fini) (void);
315 grub_err_t (*setup) (unsigned int width, unsigned int height,
316 grub_video_mode_type_t mode_type,
317 grub_video_mode_type_t mode_mask);
319 grub_err_t (*get_info) (struct grub_video_mode_info *mode_info);
321 grub_err_t (*get_info_and_fini) (struct grub_video_mode_info *mode_info,
322 void **framebuffer);
324 grub_err_t (*set_palette) (unsigned int start, unsigned int count,
325 struct grub_video_palette_data *palette_data);
327 grub_err_t (*get_palette) (unsigned int start, unsigned int count,
328 struct grub_video_palette_data *palette_data);
330 grub_err_t (*set_viewport) (unsigned int x, unsigned int y,
331 unsigned int width, unsigned int height);
333 grub_err_t (*get_viewport) (unsigned int *x, unsigned int *y,
334 unsigned int *width, unsigned int *height);
336 grub_video_color_t (*map_color) (grub_uint32_t color_name);
338 grub_video_color_t (*map_rgb) (grub_uint8_t red, grub_uint8_t green,
339 grub_uint8_t blue);
341 grub_video_color_t (*map_rgba) (grub_uint8_t red, grub_uint8_t green,
342 grub_uint8_t blue, grub_uint8_t alpha);
344 grub_err_t (*unmap_color) (grub_video_color_t color,
345 grub_uint8_t *red, grub_uint8_t *green,
346 grub_uint8_t *blue, grub_uint8_t *alpha);
348 grub_err_t (*fill_rect) (grub_video_color_t color, int x, int y,
349 unsigned int width, unsigned int height);
351 grub_err_t (*blit_bitmap) (struct grub_video_bitmap *bitmap,
352 enum grub_video_blit_operators oper,
353 int x, int y, int offset_x, int offset_y,
354 unsigned int width, unsigned int height);
356 grub_err_t (*blit_render_target) (struct grub_video_render_target *source,
357 enum grub_video_blit_operators oper,
358 int x, int y, int offset_x, int offset_y,
359 unsigned int width, unsigned int height);
361 grub_err_t (*scroll) (grub_video_color_t color, int dx, int dy);
363 grub_err_t (*swap_buffers) (void);
365 grub_err_t (*create_render_target) (struct grub_video_render_target **result,
366 unsigned int width, unsigned int height,
367 unsigned int mode_type);
369 grub_err_t (*delete_render_target) (struct grub_video_render_target *target);
371 grub_err_t (*set_active_render_target) (struct grub_video_render_target *target);
373 grub_err_t (*get_active_render_target) (struct grub_video_render_target **target);
375 int (*iterate) (int (*hook) (const struct grub_video_mode_info *info));
377 grub_err_t (*get_edid) (struct grub_video_edid_info *edid_info);
379 void (*print_adapter_specific_info) (void);
381 typedef struct grub_video_adapter *grub_video_adapter_t;
383 extern grub_video_adapter_t EXPORT_VAR(grub_video_adapter_list);
385 #ifndef GRUB_LST_GENERATOR
386 /* Register video driver. */
387 static inline void
388 grub_video_register (grub_video_adapter_t adapter)
390 grub_video_adapter_t *p;
391 for (p = &grub_video_adapter_list; *p && (*p)->prio > adapter->prio;
392 p = &((*p)->next));
393 adapter->next = *p;
394 *p = adapter;
396 #endif
398 /* Unregister video driver. */
399 static inline void
400 grub_video_unregister (grub_video_adapter_t adapter)
402 grub_list_remove (GRUB_AS_LIST (adapter));
405 #define FOR_VIDEO_ADAPTERS(var) FOR_LIST_ELEMENTS((var), (grub_video_adapter_list))
407 grub_err_t EXPORT_FUNC (grub_video_restore) (void);
409 grub_err_t EXPORT_FUNC (grub_video_get_info) (struct grub_video_mode_info *mode_info);
411 /* Framebuffer address may change as a part of normal operation
412 (e.g. double buffering). That's why you need to stop video subsystem to be
413 sure that framebuffer address doesn't change. To ensure this abstraction
414 grub_video_get_info_and_fini is the only function supplying framebuffer
415 address. */
416 grub_err_t EXPORT_FUNC (grub_video_get_info_and_fini) (struct grub_video_mode_info *mode_info,
417 void **framebuffer);
419 enum grub_video_blit_format grub_video_get_blit_format (struct grub_video_mode_info *mode_info);
421 grub_err_t grub_video_set_palette (unsigned int start, unsigned int count,
422 struct grub_video_palette_data *palette_data);
424 grub_err_t EXPORT_FUNC (grub_video_get_palette) (unsigned int start,
425 unsigned int count,
426 struct grub_video_palette_data *palette_data);
428 grub_err_t EXPORT_FUNC (grub_video_set_viewport) (unsigned int x,
429 unsigned int y,
430 unsigned int width,
431 unsigned int height);
433 grub_err_t EXPORT_FUNC (grub_video_get_viewport) (unsigned int *x,
434 unsigned int *y,
435 unsigned int *width,
436 unsigned int *height);
438 grub_video_color_t EXPORT_FUNC (grub_video_map_color) (grub_uint32_t color_name);
440 grub_video_color_t EXPORT_FUNC (grub_video_map_rgb) (grub_uint8_t red,
441 grub_uint8_t green,
442 grub_uint8_t blue);
444 grub_video_color_t EXPORT_FUNC (grub_video_map_rgba) (grub_uint8_t red,
445 grub_uint8_t green,
446 grub_uint8_t blue,
447 grub_uint8_t alpha);
449 grub_err_t EXPORT_FUNC (grub_video_unmap_color) (grub_video_color_t color,
450 grub_uint8_t *red,
451 grub_uint8_t *green,
452 grub_uint8_t *blue,
453 grub_uint8_t *alpha);
455 grub_err_t EXPORT_FUNC (grub_video_fill_rect) (grub_video_color_t color,
456 int x, int y,
457 unsigned int width,
458 unsigned int height);
460 grub_err_t EXPORT_FUNC (grub_video_blit_bitmap) (struct grub_video_bitmap *bitmap,
461 enum grub_video_blit_operators oper,
462 int x, int y,
463 int offset_x, int offset_y,
464 unsigned int width,
465 unsigned int height);
467 grub_err_t EXPORT_FUNC (grub_video_blit_render_target) (struct grub_video_render_target *source,
468 enum grub_video_blit_operators oper,
469 int x, int y,
470 int offset_x,
471 int offset_y,
472 unsigned int width,
473 unsigned int height);
475 grub_err_t grub_video_scroll (grub_video_color_t color, int dx, int dy);
477 grub_err_t EXPORT_FUNC (grub_video_swap_buffers) (void);
479 grub_err_t EXPORT_FUNC (grub_video_create_render_target) (struct grub_video_render_target **result,
480 unsigned int width,
481 unsigned int height,
482 unsigned int mode_type);
484 grub_err_t EXPORT_FUNC (grub_video_delete_render_target) (struct grub_video_render_target *target);
486 grub_err_t EXPORT_FUNC (grub_video_set_active_render_target) (struct grub_video_render_target *target);
488 grub_err_t grub_video_get_active_render_target (struct grub_video_render_target **target);
490 grub_err_t EXPORT_FUNC (grub_video_edid_checksum) (struct grub_video_edid_info *edid_info);
491 grub_err_t EXPORT_FUNC (grub_video_edid_preferred_mode) (struct grub_video_edid_info *edid_info,
492 unsigned int *width,
493 unsigned int *height);
495 grub_err_t EXPORT_FUNC (grub_video_set_mode) (const char *modestring,
496 unsigned int modemask,
497 unsigned int modevalue);
499 static inline int
500 grub_video_check_mode_flag (grub_video_mode_type_t flags,
501 grub_video_mode_type_t mask,
502 grub_video_mode_type_t flag, int def)
504 return (flag & mask) ? !! (flags & flag) : def;
507 grub_video_driver_id_t EXPORT_FUNC (grub_video_get_driver_id) (void);
509 static __inline grub_video_rgba_color_t
510 grub_video_rgba_color_rgb (int r, int g, int b)
512 grub_video_rgba_color_t c;
513 c.red = r;
514 c.green = g;
515 c.blue = b;
516 c.alpha = 255;
517 return c;
520 static __inline grub_video_color_t
521 grub_video_map_rgba_color (grub_video_rgba_color_t c)
523 return grub_video_map_rgba (c.red, c.green, c.blue, c.alpha);
526 int EXPORT_FUNC (grub_video_get_named_color) (const char *name,
527 grub_video_rgba_color_t *color);
529 grub_err_t EXPORT_FUNC (grub_video_parse_color) (const char *s,
530 grub_video_rgba_color_t *color);
532 #ifndef GRUB_MACHINE_EMU
533 extern void grub_font_init (void);
534 extern void grub_font_fini (void);
535 extern void grub_gfxterm_init (void);
536 extern void grub_gfxterm_fini (void);
537 extern void grub_video_sm712_init (void);
538 extern void grub_video_sm712_fini (void);
539 extern void grub_video_sis315pro_init (void);
540 extern void grub_video_radeon_fuloong2e_init (void);
541 extern void grub_video_sis315pro_fini (void);
542 extern void grub_video_radeon_fuloong2e_fini (void);
543 #endif
545 #endif /* ! GRUB_VIDEO_HEADER */