grub-dev: Video API
10.1 Video API
==============
10.1.1 grub_video_setup
-----------------------
* Prototype:
grub_err_t
grub_video_setup (unsigned int width, unsigned int height, unsigned int mode_type);
* Description:
Driver will use information provided to it to select best possible
video mode and switch to it. Supported values for 'mode_type' are
'GRUB_VIDEO_MODE_TYPE_INDEX_COLOR' for index color modes,
'GRUB_VIDEO_MODE_TYPE_RGB' for direct RGB color modes and
'GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED' for double buffering. When
requesting RGB mode, highest bits per pixel mode will be selected.
When requesting Index color mode, mode with highest number of
colors will be selected. If all parameters are specified as zero,
video adapter will try to figure out best possible mode and
initialize it, platform specific differences are allowed here. If
there is no mode matching request, error X will be returned. If
there are no problems, function returns 'GRUB_ERR_NONE'.
This function also performs following task upon succesful mode
switch. Active rendering target is changed to screen and viewport
is maximized to allow whole screen to be used when performing
graphics operations. In RGB modes, emulated palette gets 16
entries containing default values for VGA palette, other colors are
defined as black. When switching to Indexed Color mode, driver may
set default VGA palette to screen if the video card allows the
operation.
10.1.2 grub_video_restore
-------------------------
* Prototype:
grub_err_t
grub_video_restore (void);
* Description:
Video subsystem will deinitialize activated video driver to restore
old state of video device. This can be used to switch back to text
mode.
10.1.3 grub_video_get_info
--------------------------
* Prototype:
grub_err_t
grub_video_get_info (struct grub_video_mode_info *mode_info);
struct grub_video_mode_info
{
/* Width of the screen. */
unsigned int width;
/* Height of the screen. */
unsigned int height;
/* Mode type bitmask. Contains information like is it Index color or
RGB mode. */
unsigned int mode_type;
/* Bits per pixel. */
unsigned int bpp;
/* Bytes per pixel. */
unsigned int bytes_per_pixel;
/* Pitch of one scanline. How many bytes there are for scanline. */
unsigned int pitch;
/* In index color mode, number of colors. In RGB mode this is 256. */
unsigned int number_of_colors;
/* Optimization hint how binary data is coded. */
enum grub_video_blit_format blit_format;
/* How many bits are reserved for red color. */
unsigned int red_mask_size;
/* What is location of red color bits. In Index Color mode, this is 0. */
unsigned int red_field_pos;
/* How many bits are reserved for green color. */
unsigned int green_mask_size;
/* What is location of green color bits. In Index Color mode, this is 0. */
unsigned int green_field_pos;
/* How many bits are reserved for blue color. */
unsigned int blue_mask_size;
/* What is location of blue color bits. In Index Color mode, this is 0. */
unsigned int blue_field_pos;
/* How many bits are reserved in color. */
unsigned int reserved_mask_size;
/* What is location of reserved color bits. In Index Color mode,
this is 0. */
unsigned int reserved_field_pos;
};
* Description:
Software developer can use this function to query properties of
active rendering taget. Information provided here can be used by
other parts of GRUB, like image loaders to convert loaded images to
correct screen format to allow more optimized blitters to be used.
If there there is no configured video driver with active screen,
error 'GRUB_ERR_BAD_DEVICE' is returned, otherwise 'mode_info' is
filled with valid information and 'GRUB_ERR_NONE' is returned.
10.1.4 grub_video_get_blit_format
---------------------------------
* Prototype:
enum grub_video_blit_format
grub_video_get_blit_format (struct grub_video_mode_info *mode_info);
enum grub_video_blit_format
{
/* Follow exactly field & mask information. */
GRUB_VIDEO_BLIT_FORMAT_RGBA,
/* Make optimization assumption. */
GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8,
/* Follow exactly field & mask information. */
GRUB_VIDEO_BLIT_FORMAT_RGB,
/* Make optimization assumption. */
GRUB_VIDEO_BLIT_FORMAT_R8G8B8,
/* When needed, decode color or just use value as is. */
GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR
};
* Description:
Used to query how data could be optimized to suit specified video
mode. Returns exact video format type, or a generic one if there
is no definition for the type. For generic formats, use
'grub_video_get_info' to query video color coding settings.
10.1.5 grub_video_set_palette
-----------------------------
* Prototype:
grub_err_t
grub_video_set_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data);
struct grub_video_palette_data
{
grub_uint8_t r; /* Red color value (0-255). */
grub_uint8_t g; /* Green color value (0-255). */
grub_uint8_t b; /* Blue color value (0-255). */
grub_uint8_t a; /* Reserved bits value (0-255). */
};
* Description:
Used to setup indexed color palettes. If mode is RGB mode, colors
will be set to emulated palette data. In Indexed Color modes,
palettes will be set to hardware. Color values will be converted
to suit requirements of the video mode. 'start' will tell what
hardware color index (or emulated color index) will be set to
according information in first indice of 'palette_data', after that
both hardware color index and 'palette_data' index will be
incremented until 'count' number of colors have been set.
10.1.6 grub_video_get_palette
-----------------------------
* Prototype:
grub_err_t
grub_video_get_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data);
struct grub_video_palette_data
{
grub_uint8_t r; /* Red color value (0-255). */
grub_uint8_t g; /* Green color value (0-255). */
grub_uint8_t b; /* Blue color value (0-255). */
grub_uint8_t a; /* Reserved bits value (0-255). */
};
* Description:
Used to query indexed color palettes. If mode is RGB mode, colors
will be copied from emulated palette data. In Indexed Color modes,
palettes will be read from hardware. Color values will be
converted to suit structure format. 'start' will tell what
hardware color index (or emulated color index) will be used as a
source for first indice of 'palette_data', after that both hardware
color index and 'palette_data' index will be incremented until
'count' number of colors have been read.
10.1.7 grub_video_set_area_status
---------------------------------
* Prototype:
grub_err_t
grub_video_set_area_status (grub_video_area_status_t area_status);
enum grub_video_area_status_t
{
GRUB_VIDEO_AREA_DISABLED,
GRUB_VIDEO_AREA_ENABLED
};
* Description:
Used to set area drawing mode for redrawing the specified region.
Draw commands are performed in the intersection of the viewport and
the region called area. Coordinates remain related to the
viewport. If draw commands try to draw over the area, they are
clipped. Set status to DISABLED if you need to draw everything.
Set status to ENABLED and region to the desired rectangle to redraw
everything inside the region leaving everything else intact.
Should be used for redrawing of active elements.
10.1.8 grub_video_get_area_status
---------------------------------
* Prototype:
grub_err_r
grub_video_get_area_status (grub_video_area_status_t *area_status);
* Description: Used to query the area status.
10.1.9 grub_video_set_viewport
------------------------------
* Prototype:
grub_err_t
grub_video_set_viewport (unsigned int x, unsigned int y, unsigned int width, unsigned int height);
* Description:
Used to specify viewport where draw commands are performed. When
viewport is set, all draw commands coordinates relate to those
specified by 'x' and 'y'. If draw commands try to draw over
viewport, they are clipped. If developer requests larger than
possible viewport, width and height will be clamped to fit screen.
If 'x' and 'y' are out of bounds, all functions drawing to screen
will not be displayed. In order to maximize viewport, use
'grub_video_get_info' to query actual screen dimensions and provide
that information to this function.
10.1.10 grub_video_get_viewport
-------------------------------
* Prototype:
grub_err_t
grub_video_get_viewport (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height);
* Description:
Used to query current viewport dimensions. Software developer can
use this to choose best way to render contents of the viewport.
10.1.11 grub_video_set_region
-----------------------------
* Prototype:
grub_err_t
grub_video_set_region (unsigned int x, unsigned int y, unsigned int width, unsigned int height);
* Description:
Used to specify the region of the screen which should be redrawn.
Use absolute values. When the region is set and area status is
ENABLE all draw commands will be performed inside the interseption
of region and viewport named area. If draw commands try to draw
over viewport, they are clipped. If developer requests larger than
possible region, width and height will be clamped to fit screen.
Should be used for redrawing of active elements.
10.1.12 grub_video_get_region
-----------------------------
* Prototype:
grub_err_t
grub_video_get_region (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height);
* Description:
Used to query current region dimensions.
10.1.13 grub_video_map_color
----------------------------
* Prototype:
grub_video_color_t
grub_video_map_color (grub_uint32_t color_name);
* Description:
Map color can be used to support color themes in GRUB. There will
be collection of color names that can be used to query actual
screen mapped color data. Examples could be
'GRUB_COLOR_CONSOLE_BACKGROUND', 'GRUB_COLOR_CONSOLE_TEXT'. The
actual color defines are not specified at this point.
10.1.14 grub_video_map_rgb
--------------------------
* Prototype:
grub_video_color_t
grub_video_map_rgb (grub_uint8_t red, grub_uint8_t green, grub_uint8_t blue);
* Description:
Map RGB values to compatible screen color data. Values are
expected to be in range 0-255 and in RGB modes they will be
converted to screen color data. In index color modes, index color
palette will be searched for specified color and then index is
returned.
10.1.15 grub_video_map_rgba
---------------------------
* Prototype:
grub_video_color_t
grub_video_map_rgba (grub_uint8_t red, grub_uint8_t green, grub_uint8_t blue, grub_uint8_t alpha);
* Description:
Map RGBA values to compatible screen color data. Values are
expected to be in range 0-255. In RGBA modes they will be
converted to screen color data. In index color modes, index color
palette will be searched for best matching color and its index is
returned.
10.1.16 grub_video_unmap_color
------------------------------
* Prototype:
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_uint8_t *alpha);
* Description:
Unmap color value from 'color' to color channels in 'red', 'green',
'blue' and 'alpha'. Values will be in range 0-255. Active
rendering target will be used for color domain. In case alpha
information is not available in rendering target, it is assumed to
be opaque (having value 255).
10.1.17 grub_video_fill_rect
----------------------------
* Prototype:
grub_err_t
grub_video_fill_rect (grub_video_color_t color, int x, int y, unsigned int width, unsigned int height);
* Description:
Fill specified area limited by given coordinates within specified
viewport. Negative coordinates are accepted in order to allow easy
moving of rectangle within viewport. If coordinates are negative,
area of the rectangle will be shrinken to follow size limits of the
viewport.
Software developer should use either 'grub_video_map_color',
'grub_video_map_rgb' or 'grub_video_map_rgba' to map requested
color to 'color' parameter.
10.1.18 grub_video_blit_glyph
-----------------------------
* Prototype:
grub_err_t
grub_video_blit_glyph (struct grub_font_glyph *glyph, grub_video_color_t color, int x, int y);
struct grub_font_glyph {
/* TBD. */
};
* Description:
Used to blit glyph to viewport in specified coodinates. If glyph
is at edge of viewport, pixels outside of viewport will be clipped
out. Software developer should use either 'grub_video_map_rgb' or
'grub_video_map_rgba' to map requested color to 'color' parameter.
10.1.19 grub_video_blit_bitmap
------------------------------
* Prototype:
grub_err_t
grub_video_blit_bitmap (struct grub_video_bitmap *bitmap, enum grub_video_blit_operators oper, int x, int y, int offset_x, int offset_y, unsigned int width, unsigned int height);
struct grub_video_bitmap
{
/* TBD. */
};
enum grub_video_blit_operators
{
GRUB_VIDEO_BLIT_REPLACE,
GRUB_VIDEO_BLIT_BLEND
};
* Description:
Used to blit bitmap to viewport in specified coordinates. If part
of bitmap is outside of viewport region, it will be clipped out.
Offsets affect bitmap position where data will be copied from.
Negative values for both viewport coordinates and bitmap offset
coordinates are allowed. If data is looked out of bounds of
bitmap, color value will be assumed to be transparent. If viewport
coordinates are negative, area of the blitted rectangle will be
shrinken to follow size limits of the viewport and bitmap.
Blitting operator 'oper' specifies should source pixel replace data
in screen or blend with pixel alpha value.
Software developer should use 'grub_video_bitmap_create' or
'grub_video_bitmap_load' to create or load bitmap data.
10.1.20 grub_video_blit_render_target
-------------------------------------
* Prototype:
grub_err_t
grub_video_blit_render_target (struct grub_video_render_target *source, enum grub_video_blit_operators oper, int x, int y, int offset_x, int offset_y, unsigned int width, unsigned int height);
struct grub_video_render_target {
/* This is private data for video driver. Should not be accessed from elsewhere directly. */
};
enum grub_video_blit_operators
{
GRUB_VIDEO_BLIT_REPLACE,
GRUB_VIDEO_BLIT_BLEND
};
* Description:
Used to blit source render target to viewport in specified
coordinates. If part of source render target is outside of
viewport region, it will be clipped out. If blitting operator is
specified and source contains alpha values, resulting pixel color
components will be calculated using formula ((src_color *
src_alpha) + (dst_color * (255 - src_alpha)) / 255, if target
buffer has alpha, it will be set to src_alpha. Offsets affect
render target position where data will be copied from. If data is
looked out of bounds of render target, color value will be assumed
to be transparent. Blitting operator 'oper' specifies should
source pixel replace data in screen or blend with pixel alpha
value.
10.1.21 grub_video_scroll
-------------------------
* Prototype:
grub_err_t
grub_video_scroll (grub_video_color_t color, int dx, int dy);
* Description:
Used to scroll viewport to specified direction. New areas are
filled with specified color. This function is used when screen is
scroller up in video terminal.
10.1.22 grub_video_swap_buffers
-------------------------------
* Prototype:
grub_err_t
grub_video_swap_buffers (void);
* Description:
If double buffering is enabled, this swaps frontbuffer and
backbuffer, in order to show values drawn to back buffer. Video
driver is free to choose how this operation is techincally done.
10.1.23 grub_video_create_render_target
---------------------------------------
* Prototype:
grub_err_t
grub_video_create_render_target (struct grub_video_render_target **result, unsigned int width, unsigned int height, unsigned int mode_type);
struct grub_video_render_target {
/* This is private data for video driver. Should not be accessed from elsewhere directly. */
};
* Description:
Driver will use information provided to it to create best fitting
render target. 'mode_type' will be used to guide on selecting what
features are wanted for render target. Supported values for
'mode_type' are 'GRUB_VIDEO_MODE_TYPE_INDEX_COLOR' for index color
modes, 'GRUB_VIDEO_MODE_TYPE_RGB' for direct RGB color modes and
'GRUB_VIDEO_MODE_TYPE_ALPHA' for alpha component.
10.1.24 grub_video_delete_render_target
---------------------------------------
* Prototype:
grub_err_t
grub_video_delete_render_target (struct grub_video_render_target *target);
* Description:
Used to delete previously created render target. If 'target'
contains 'NULL' pointer, nothing will be done. If render target is
correctly destroyed, GRUB_ERR_NONE is returned.
10.1.25 grub_video_set_active_render_target
-------------------------------------------
* Prototype:
grub_err_t
grub_video_set_active_render_target (struct grub_video_render_target *target);
* Description:
Sets active render target. If this comand is successful all
drawing commands will be done to specified 'target'. There is also
special values for target, 'GRUB_VIDEO_RENDER_TARGET_DISPLAY' used
to reference screen's front buffer,
'GRUB_VIDEO_RENDER_TARGET_FRONT_BUFFER' used to reference screen's
front buffer (alias for 'GRUB_VIDEO_RENDER_TARGET_DISPLAY') and
'GRUB_VIDEO_RENDER_TARGET_BACK_BUFFER' used to reference back
buffer (if double buffering is enabled). If render target is
correclty switched GRUB_ERR_NONE is returned. In no any event
shall there be non drawable active render target.
10.1.26 grub_video_get_active_render_target
-------------------------------------------
* Prototype:
grub_err_t
grub_video_get_active_render_target (struct grub_video_render_target **target);
* Description:
Returns currently active render target. It returns value in
'target' that can be subsequently issued back to
'grub_video_set_active_render_target'.