libdragon
|
Software routines for manipulating graphics in a display context. More...
Data Structures | |
struct | color_t |
Generic color structure. More... | |
struct | sprite_t |
Sprite structure. More... | |
Files | |
file | graphics.c |
2D Graphics | |
file | font.h |
Font Data. | |
file | graphics.h |
2D Graphics | |
Defines | |
#define | __set_pixel(buffer, x, y, color) (buffer)[(x) + ((y) * __width)] = color |
Macro to set a pixel to a certain color in a buffer. | |
#define | __get_pixel(buffer, x, y) (buffer)[(x) + ((y) * __width)] |
Macro to get a pixel color from a buffer. | |
#define | __get_buffer(x) __safe_buffer[(x)-1] |
Get the correct video buffer given a display context. | |
Functions | |
uint32_t | graphics_make_color (int r, int g, int b, int a) |
Return a 32-bit representation of an RGBA color. | |
uint32_t | graphics_convert_color (color_t color) |
Convert a color structure to a 32-bit representation of an RGBA color. | |
void | graphics_set_color (uint32_t forecolor, uint32_t backcolor) |
Set the current forecolor and backcolor for text operations. | |
static int | __is_transparent (int bitdepth, uint32_t color) |
Return whether a color is fully transparent at a particular bit depth. | |
void | graphics_draw_pixel (display_context_t disp, int x, int y, uint32_t color) |
Draw a pixel to a given display context. | |
void | graphics_draw_pixel_trans (display_context_t disp, int x, int y, uint32_t color) |
Draw a pixel to a given display context with alpha support. | |
void | graphics_draw_line (display_context_t disp, int x0, int y0, int x1, int y1, uint32_t color) |
Draw a line to a given display context. | |
void | graphics_draw_line_trans (display_context_t disp, int x0, int y0, int x1, int y1, uint32_t color) |
Draw a line to a given display context with alpha support. | |
void | graphics_draw_box (display_context_t disp, int x, int y, int width, int height, uint32_t color) |
Draw a filled rectangle to a display context. | |
void | graphics_draw_box_trans (display_context_t disp, int x, int y, int width, int height, uint32_t color) |
Draw a filled rectangle to a display context. | |
void | graphics_fill_screen (display_context_t disp, uint32_t c) |
Fill the entire screen with a particular color. | |
void | graphics_draw_character (display_context_t disp, int x, int y, char ch) |
Draw a character to the screen using the built-in font. | |
void | graphics_draw_text (display_context_t disp, int x, int y, const char *const msg) |
Draw a null terminated string to a display context. | |
void | graphics_draw_sprite (display_context_t disp, int x, int y, sprite_t *sprite) |
Draw a sprite to a display context. | |
void | graphics_draw_sprite_stride (display_context_t disp, int x, int y, sprite_t *sprite, int offset) |
Draw a sprite from a spritemap to a display context. | |
void | graphics_draw_sprite_trans (display_context_t disp, int x, int y, sprite_t *sprite) |
Draw a sprite to a display context with alpha transparency. | |
void | graphics_draw_sprite_trans_stride (display_context_t disp, int x, int y, sprite_t *sprite, int offset) |
Draw a sprite from a spritemap to a display context. | |
Variables | |
uint32_t | __bitdepth |
Currently active bit depth. | |
uint32_t | __width |
Currently active video width (calculated) | |
uint32_t | __height |
Currently active video height (calculated) | |
void * | __safe_buffer [] |
Pointer to uncached 16-bit aligned version of buffers. | |
static uint32_t | f_color = 0xFFFFFFFF |
Generic foreground color. | |
static uint32_t | b_color = 0x00000000 |
Generic background color. | |
static unsigned char const | __font_data [2048] |
Monochrome fixed-width font. |
Software routines for manipulating graphics in a display context.
The graphics subsystem is responsible for software manipulation of a display context as returned from the Display Subsystem. All of the functions use a pure software drawing method and are thus much slower than hardware sprite support. However, they are slightly more flexible and offer no hardware limitations in terms of sprite size.
Code wishing to draw to the screen should first acquire a display contect using display_lock. Once the display context is acquired, code may draw to the context using any of the graphics functions present. Wherever practical, two versions of graphics functions are available: a transparent variety and a non-transparent variety. Code that wishes to display sprites without transparency can get a slight performance boost by using the non-transparent viariety of calls since no software alpha blending needs to occur. Once code has finished drawing to the display context, it can be displayed to the screen using display_show.
The graphics subsystem makes use of the same contexts as the Hardware Display Interface. Thus, with careful coding, both hardware and software routines can be used to draw to the display context with no ill effects. The colors returned by graphics_make_color and graphics_convert_color are also compatible with both hardware and software graphics routines.
#define __get_buffer | ( | x | ) | __safe_buffer[(x)-1] |
Get the correct video buffer given a display context.
[in] | x | The current display context |
#define __get_pixel | ( | buffer, | |
x, | |||
y | |||
) | (buffer)[(x) + ((y) * __width)] |
Macro to get a pixel color from a buffer.
[in] | buffer | Pointer to a uint16_t or uint32_t array treated as a video buffer |
[in] | x | X coordinate in pixels to grab the color from |
[in] | y | Y coordinate in pixels to grab the color from |
#define __set_pixel | ( | buffer, | |
x, | |||
y, | |||
color | |||
) | (buffer)[(x) + ((y) * __width)] = color |
Macro to set a pixel to a certain color in a buffer.
[out] | buffer | Pointer to a uint16_t or uint32_t array treated as a video buffer |
[in] | x | X coordinate in pixels to place the color |
[in] | y | Y coordinate in pixels to place the color |
[in] | color | A 16 or 32 bit color value to set the requested pixel to. Must match the buffer in pixel bit width. |
static int __is_transparent | ( | int | bitdepth, |
uint32_t | color | ||
) | [static] |
Return whether a color is fully transparent at a particular bit depth.
[in] | bitdepth | Either 2 or 4 for 16 bpp or 32 bpp mode. |
[in] | color | 32-bit RBA color. Use graphics_convert_color or graphics_make_color to generate this value. |
1 | if the color is fully transparent |
0 | if the color is translucent or opaque |
uint32_t graphics_convert_color | ( | color_t | color | ) |
Convert a color structure to a 32-bit representation of an RGBA color.
[in] | color | A color structure representing an RGBA color |
void graphics_draw_box | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
int | width, | ||
int | height, | ||
uint32_t | color | ||
) |
Draw a filled rectangle to a display context.
[in] | disp | The currently active display context. |
[in] | x | The x coordinate of the top left of the box. |
[in] | y | The y coordinate of the top left of the box. |
[in] | width | The width of the box in pixels. |
[in] | height | The height of the box in pixels. |
[in] | color | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
void graphics_draw_box_trans | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
int | width, | ||
int | height, | ||
uint32_t | color | ||
) |
Draw a filled rectangle to a display context.
[in] | disp | The currently active display context. |
[in] | x | The x coordinate of the top left of the box. |
[in] | y | The y coordinate of the top left of the box. |
[in] | width | The width of the box in pixels. |
[in] | height | The height of the box in pixels. |
[in] | color | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
void graphics_draw_character | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
char | ch | ||
) |
Draw a character to the screen using the built-in font.
Need a set font mechanism.
Need to look up the width and height from the font instead of assuming it is 8x8.
Draw a character from the built-in font to the screen. This function does not support alpha blending, only binary transparency. If the background color is fully transparent, the font is drawn with no background. Otherwise, the font is drawn on a fully colored background. The foreground and background can be set using graphics_set_color.
[in] | disp | The currently active display context. |
[in] | x | The X coordinate to place the top left pixel of the character drawn. |
[in] | y | The Y coordinate to place the top left pixel of the character drawn. |
[in] | ch | The ASCII character to draw to the screen. |
void graphics_draw_line | ( | display_context_t | disp, |
int | x0, | ||
int | y0, | ||
int | x1, | ||
int | y1, | ||
uint32_t | color | ||
) |
Draw a line to a given display context.
[in] | disp | The currently active display context. |
[in] | x0 | The x coordinate of the start of the line. |
[in] | y0 | The y coordinate of the start of the line. |
[in] | x1 | The x coordinate of the end of the line. |
[in] | y1 | The y coordinate of the end of the line. |
[in] | color | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
void graphics_draw_line_trans | ( | display_context_t | disp, |
int | x0, | ||
int | y0, | ||
int | x1, | ||
int | y1, | ||
uint32_t | color | ||
) |
Draw a line to a given display context with alpha support.
[in] | disp | The currently active display context. |
[in] | x0 | The x coordinate of the start of the line. |
[in] | y0 | The y coordinate of the start of the line. |
[in] | x1 | The x coordinate of the end of the line. |
[in] | y1 | The y coordinate of the end of the line. |
[in] | color | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
void graphics_draw_pixel | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
uint32_t | color | ||
) |
Draw a pixel to a given display context.
[in] | disp | The currently active display context. |
[in] | x | The x coordinate of the pixel. |
[in] | y | The y coordinate of the pixel. |
[in] | color | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
void graphics_draw_pixel_trans | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
uint32_t | color | ||
) |
Draw a pixel to a given display context with alpha support.
[in] | disp | The currently active display context. |
[in] | x | The x coordinate of the pixel. |
[in] | y | The y coordinate of the pixel. |
[in] | color | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
void graphics_draw_sprite | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
sprite_t * | sprite | ||
) |
Draw a sprite to a display context.
Given a sprite structure, this function will draw a sprite to the display context with clipping support.
[in] | disp | The currently active display context. |
[in] | x | The X coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped horizontally. |
[in] | y | The Y coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped vertically. |
[in] | sprite | Pointer to a sprite structure to display to the screen. |
void graphics_draw_sprite_stride | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
sprite_t * | sprite, | ||
int | offset | ||
) |
Draw a sprite from a spritemap to a display context.
Given a sprite structure, this function will draw a sprite out of a larger spritemap to the display context with clipping support. This function is useful for software tilemapping. If a sprite was generated as a spritemap (it has more than one horizontal or vertical slice), this function can display a slice of the sprite as a standalone sprite.
Given a sprite with 3 horizontal slices and 2 vertical slices, the offsets would be as follows:
*---*---*---* | 0 | 1 | 2 | *---*---*---* | 3 | 4 | 5 | *---*---*---*
[in] | disp | The currently active display context. |
[in] | x | The X coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped horizontally. |
[in] | y | The Y coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped vertically. |
[in] | sprite | Pointer to a sprite structure to display to the screen. |
[in] | offset | Offset of the sprite to display out of the spritemap. The offset is counted starting from 0. The top left sprite in the map is 0, the next one to the right is 1, and so on. |
void graphics_draw_sprite_trans | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
sprite_t * | sprite | ||
) |
Draw a sprite to a display context with alpha transparency.
Given a sprite structure, this function will draw a sprite to the display context with clipping support.
[in] | disp | The currently active display context. |
[in] | x | The X coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped horizontally. |
[in] | y | The Y coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped vertically. |
[in] | sprite | Pointer to a sprite structure to display to the screen. |
void graphics_draw_sprite_trans_stride | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
sprite_t * | sprite, | ||
int | offset | ||
) |
Draw a sprite from a spritemap to a display context.
Given a sprite structure, this function will draw a sprite out of a larger spritemap to the display context with clipping support. This function is useful for software tilemapping. If a sprite was generated as a spritemap (it has more than one horizontal or vertical slice), this function can display a slice of the sprite as a standalone sprite.
Given a sprite with 3 horizontal slices and 2 vertical slices, the offsets would be as follows:
*---*---*---* | 0 | 1 | 2 | *---*---*---* | 3 | 4 | 5 | *---*---*---*
[in] | disp | The currently active display context. |
[in] | x | The X coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped horizontally. |
[in] | y | The Y coordinate to place the top left pixel of the sprite. This can be negative if the sprite is clipped vertically. |
[in] | sprite | Pointer to a sprite structure to display to the screen. |
[in] | offset | Offset of the sprite to display out of the spritemap. The offset is counted starting from 0. The top left sprite in the map is 0, the next one to the right is 1, and so on. |
void graphics_draw_text | ( | display_context_t | disp, |
int | x, | ||
int | y, | ||
const char *const | msg | ||
) |
Draw a null terminated string to a display context.
Draw a string to the screen, following a few simple rules. Standard ASCII is supported, as well as \r, \n, space and tab. \r and \n will both cause the next character to be rendered one line lower and at the x coordinate specified in the parameters. The tab character inserts five spaces.
This function does not support alpha blending, only binary transparency. If the background color is fully transparent, the font is drawn with no background. Otherwise, the font is drawn on a fully colored background. The foreground and background can be set using graphics_set_color.
[in] | disp | The currently active display context. |
[in] | x | The X coordinate to place the top left pixel of the character drawn. |
[in] | y | The Y coordinate to place the top left pixel of the character drawn. |
[in] | msg | The ASCII null terminated string to draw to the screen. |
void graphics_fill_screen | ( | display_context_t | disp, |
uint32_t | c | ||
) |
Fill the entire screen with a particular color.
[in] | disp | The currently active display context. |
[in] | c | The 32-bit RGBA color to draw to the screen. Use graphics_convert_color or graphics_make_color to generate this value. |
uint32_t graphics_make_color | ( | int | r, |
int | g, | ||
int | b, | ||
int | a | ||
) |
Return a 32-bit representation of an RGBA color.
[in] | r | 8-bit red value |
[in] | g | 8-bit green value |
[in] | b | 8-bit blue value |
[in] | a | 8-bit alpha value. Note that 255 is opaque and 0 is transparent |
void graphics_set_color | ( | uint32_t | forecolor, |
uint32_t | backcolor | ||
) |
Set the current forecolor and backcolor for text operations.
[in] | forecolor | 32-bit RGBA color to use as the text color. Use graphics_convert_color or graphics_make_color to generate this value. |
[in] | backcolor | 32-bit RGBA color to use as the background color for text. Use graphics_convert_color or graphics_make_color to generate this value. Note that if the color given is transparent, text can be written over other graphics without background colors showing. |
uint32_t b_color = 0x00000000 [static] |
Generic background color.
This is transparent on 16 and 32 BPP modes
uint32_t f_color = 0xFFFFFFFF [static] |
Generic foreground color.
This is white on 16 and 32 BPP modes