Add MENU_DISPLAY_CTL_FB_DATA, MENU_DISPLAY_CTL_FB_PITCH

This commit is contained in:
twinaphex 2015-09-25 21:03:23 +02:00
parent bfb491c1e1
commit f4951300b7
3 changed files with 64 additions and 35 deletions

View File

@ -252,22 +252,24 @@ static bool rguidisp_init_font(menu_handle_t *menu)
static void rgui_render_background(void) static void rgui_render_background(void)
{ {
size_t pitch_in_pixels, size; size_t pitch_in_pixels, size, fb_pitch;
unsigned fb_width, fb_height; unsigned fb_width, fb_height;
uint16_t *fb_data = NULL;
uint16_t *src = NULL; uint16_t *src = NULL;
uint16_t *dst = NULL; uint16_t *dst = NULL;
menu_handle_t *menu = menu_driver_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr();
menu_framebuf_t *frame_buf = menu_display_fb_get_ptr();
if (!menu) if (!menu)
return; return;
menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width);
menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height);
menu_display_ctl(MENU_DISPLAY_CTL_FB_DATA, &fb_data);
menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch);
pitch_in_pixels = frame_buf->pitch >> 1; pitch_in_pixels = fb_pitch >> 1;
size = frame_buf->pitch * 4; size = fb_pitch * 4;
src = frame_buf->data + pitch_in_pixels * fb_height; src = fb_data + pitch_in_pixels * fb_height;
dst = frame_buf->data; dst = fb_data;
while (dst < src) while (dst < src)
{ {
@ -276,11 +278,11 @@ static void rgui_render_background(void)
} }
fill_rect(frame_buf->data, frame_buf->pitch, 5, 5, fb_width - 10, 5, green_filler); fill_rect(fb_data, fb_pitch, 5, 5, fb_width - 10, 5, green_filler);
fill_rect(frame_buf->data, frame_buf->pitch, 5, fb_height - 10, fb_width - 10, 5, green_filler); fill_rect(fb_data, fb_pitch, 5, fb_height - 10, fb_width - 10, 5, green_filler);
fill_rect(frame_buf->data, frame_buf->pitch, 5, 5, 5, fb_height - 10, green_filler); fill_rect(fb_data, fb_pitch, 5, 5, 5, fb_height - 10, green_filler);
fill_rect(frame_buf->data, frame_buf->pitch, fb_width - 10, 5, 5, fb_height - 10, fill_rect(fb_data, fb_pitch, fb_width - 10, 5, 5, fb_height - 10,
green_filler); green_filler);
} }
@ -299,14 +301,14 @@ static void rgui_set_message(const char *message)
static void rgui_render_messagebox(const char *message) static void rgui_render_messagebox(const char *message)
{ {
size_t i; size_t i, fb_pitch;
int x, y; int x, y;
unsigned fb_width, fb_height; unsigned fb_width, fb_height;
unsigned width, glyphs_width, height; unsigned width, glyphs_width, height;
uint16_t color; uint16_t color;
uint16_t *fb_data = NULL;
struct string_list *list = NULL; struct string_list *list = NULL;
menu_handle_t *menu = menu_driver_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr();
menu_framebuf_t *frame_buf = menu_display_fb_get_ptr();
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
if (!menu || !message || !*message) if (!menu || !message || !*message)
@ -325,6 +327,8 @@ static void rgui_render_messagebox(const char *message)
menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width);
menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height);
menu_display_ctl(MENU_DISPLAY_CTL_FB_DATA, &fb_data);
menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch);
for (i = 0; i < list->size; i++) for (i = 0; i < list->size; i++)
{ {
@ -350,14 +354,14 @@ static void rgui_render_messagebox(const char *message)
x = (fb_width - width) / 2; x = (fb_width - width) / 2;
y = (fb_height - height) / 2; y = (fb_height - height) / 2;
fill_rect(frame_buf->data, frame_buf->pitch, x + 5, y + 5, width - 10, fill_rect(fb_data, fb_pitch, x + 5, y + 5, width - 10,
height - 10, gray_filler); height - 10, gray_filler);
fill_rect(frame_buf->data, frame_buf->pitch, x, y, width - 5, 5, green_filler); fill_rect(fb_data, fb_pitch, x, y, width - 5, 5, green_filler);
fill_rect(frame_buf->data, frame_buf->pitch, x + width - 5, y, 5, fill_rect(fb_data, fb_pitch, x + width - 5, y, 5,
height - 5, green_filler); height - 5, green_filler);
fill_rect(frame_buf->data, frame_buf->pitch, x + 5, y + height - 5, fill_rect(fb_data, fb_pitch, x + 5, y + height - 5,
width - 5, 5, green_filler); width - 5, 5, green_filler);
fill_rect(frame_buf->data, frame_buf->pitch, x, y + 5, 5, fill_rect(fb_data, fb_pitch, x, y + 5, 5,
height - 5, green_filler); height - 5, green_filler);
color = NORMAL_COLOR(settings); color = NORMAL_COLOR(settings);
@ -367,7 +371,7 @@ static void rgui_render_messagebox(const char *message)
const char *msg = list->elems[i].data; const char *msg = list->elems[i].data;
int offset_x = FONT_WIDTH_STRIDE * (glyphs_width - strlen(msg)) / 2; int offset_x = FONT_WIDTH_STRIDE * (glyphs_width - strlen(msg)) / 2;
int offset_y = FONT_HEIGHT_STRIDE * i; int offset_y = FONT_HEIGHT_STRIDE * i;
blit_line(frame_buf->data, frame_buf->pitch, blit_line(fb_data, fb_pitch,
x + 8 + offset_x, y + 8 + offset_y, msg, color); x + 8 + offset_x, y + 8 + offset_y, msg, color);
} }
@ -377,16 +381,19 @@ end:
static void rgui_blit_cursor(menu_handle_t *menu) static void rgui_blit_cursor(menu_handle_t *menu)
{ {
size_t fb_pitch;
unsigned fb_width, fb_height; unsigned fb_width, fb_height;
int16_t x = menu_input_mouse_state(MENU_MOUSE_X_AXIS); uint16_t *fb_data = NULL;
int16_t y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS); int16_t x = menu_input_mouse_state(MENU_MOUSE_X_AXIS);
menu_framebuf_t *frame_buf = menu_display_fb_get_ptr(); int16_t y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS);
menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width);
menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_height); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_height);
menu_display_ctl(MENU_DISPLAY_CTL_FB_DATA, &fb_data);
menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch);
color_rect(frame_buf->data, frame_buf->pitch, fb_width, fb_height, x, y - 5, 1, 11, 0xFFFF); color_rect(fb_data, fb_pitch, fb_width, fb_height, x, y - 5, 1, 11, 0xFFFF);
color_rect(frame_buf->data, frame_buf->pitch, fb_width, fb_height, x - 5, y, 11, 1, 0xFFFF); color_rect(fb_data, fb_pitch, fb_width, fb_height, x - 5, y, 11, 1, 0xFFFF);
} }
static void rgui_render(void) static void rgui_render(void)
@ -394,14 +401,14 @@ static void rgui_render(void)
unsigned x, y; unsigned x, y;
bool display_kb; bool display_kb;
uint16_t hover_color, normal_color; uint16_t hover_color, normal_color;
size_t i, end; size_t i, end, fb_pitch;
unsigned fb_width, fb_height; unsigned fb_width, fb_height;
int bottom; int bottom;
char title[256], title_buf[256], title_msg[64]; char title[256], title_buf[256], title_msg[64];
char msg[PATH_MAX_LENGTH], timedate[PATH_MAX_LENGTH]; char msg[PATH_MAX_LENGTH], timedate[PATH_MAX_LENGTH];
uint16_t *fb_data = NULL;
menu_handle_t *menu = menu_driver_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr();
menu_display_t *disp = menu_display_get_ptr(); menu_display_t *disp = menu_display_get_ptr();
menu_framebuf_t *frame_buf = menu_display_fb_get_ptr();
driver_t *driver = driver_get_ptr(); driver_t *driver = driver_get_ptr();
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
menu_animation_t *anim = menu_animation_get_ptr(); menu_animation_t *anim = menu_animation_get_ptr();
@ -435,11 +442,13 @@ static void rgui_render(void)
menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width);
menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height);
menu_display_ctl(MENU_DISPLAY_CTL_FB_DATA, &fb_data);
menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch);
/* if the framebuffer changed size, recache the background */ /* if the framebuffer changed size, recache the background */
if (rgui->last_width != fb_width || rgui->last_height != fb_height) if (rgui->last_width != fb_width || rgui->last_height != fb_height)
{ {
fill_rect(frame_buf->data, frame_buf->pitch, 0, fb_height, fb_width, 4, gray_filler); fill_rect(fb_data, fb_pitch, 0, fb_height, fb_width, 4, gray_filler);
rgui->last_width = fb_width; rgui->last_width = fb_width;
rgui->last_height = fb_height; rgui->last_height = fb_height;
} }
@ -514,18 +523,18 @@ static void rgui_render(void)
normal_color = NORMAL_COLOR(settings); normal_color = NORMAL_COLOR(settings);
if (menu_entries_show_back()) if (menu_entries_show_back())
blit_line(frame_buf->data, frame_buf->pitch, blit_line(fb_data, fb_pitch,
RGUI_TERM_START_X(fb_width), RGUI_TERM_START_X(fb_width),
RGUI_TERM_START_X(fb_width), RGUI_TERM_START_X(fb_width),
menu_hash_to_str(MENU_VALUE_BACK), menu_hash_to_str(MENU_VALUE_BACK),
TITLE_COLOR(settings)); TITLE_COLOR(settings));
blit_line(frame_buf->data, frame_buf->pitch, blit_line(fb_data, fb_pitch,
RGUI_TERM_START_X(fb_width) + (RGUI_TERM_WIDTH(fb_width) - strlen(title_buf)) * FONT_WIDTH_STRIDE / 2, RGUI_TERM_START_X(fb_width) + (RGUI_TERM_WIDTH(fb_width) - strlen(title_buf)) * FONT_WIDTH_STRIDE / 2,
RGUI_TERM_START_X(fb_width), title_buf, TITLE_COLOR(settings)); RGUI_TERM_START_X(fb_width), title_buf, TITLE_COLOR(settings));
if (menu_entries_get_core_title(title_msg, sizeof(title_msg)) == 0) if (menu_entries_get_core_title(title_msg, sizeof(title_msg)) == 0)
blit_line(frame_buf->data, frame_buf->pitch, blit_line(fb_data, fb_pitch,
RGUI_TERM_START_X(fb_width), RGUI_TERM_START_X(fb_width),
(RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) + (RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) +
RGUI_TERM_START_Y(fb_height) + 2, title_msg, hover_color); RGUI_TERM_START_Y(fb_height) + 2, title_msg, hover_color);
@ -534,7 +543,7 @@ static void rgui_render(void)
{ {
menu_display_timedate(timedate, sizeof(timedate), 3); menu_display_timedate(timedate, sizeof(timedate), 3);
blit_line(frame_buf->data, frame_buf->pitch, blit_line(fb_data, fb_pitch,
RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE - RGUI_TERM_START_X(fb_width), RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE - RGUI_TERM_START_X(fb_width),
(RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) + (RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) +
RGUI_TERM_START_Y(fb_height) + 2, timedate, hover_color); RGUI_TERM_START_Y(fb_height) + 2, timedate, hover_color);
@ -584,7 +593,7 @@ static void rgui_render(void)
entry_spacing, entry_spacing,
type_str_buf); type_str_buf);
blit_line(frame_buf->data, frame_buf->pitch, x, y, message, entry_selected ? hover_color : normal_color); blit_line(fb_data, fb_pitch, x, y, message, entry_selected ? hover_color : normal_color);
} }
#ifdef GEKKO #ifdef GEKKO
@ -703,6 +712,7 @@ static void rgui_free(void *data)
static void rgui_set_texture(void) static void rgui_set_texture(void)
{ {
unsigned fb_width, fb_height; unsigned fb_width, fb_height;
uint16_t *fb_data = NULL;
menu_handle_t *menu = menu_driver_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr();
menu_framebuf_t *frame_buf = menu_display_fb_get_ptr(); menu_framebuf_t *frame_buf = menu_display_fb_get_ptr();
@ -713,10 +723,11 @@ static void rgui_set_texture(void)
menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width);
menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height);
menu_display_ctl(MENU_DISPLAY_CTL_FB_DATA, &fb_data);
menu_display_ctl(MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG, NULL); menu_display_ctl(MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG, NULL);
video_driver_set_texture_frame( video_driver_set_texture_frame(
frame_buf->data, fb_data,
false, false,
fb_width, fb_width,
fb_height, fb_height,

View File

@ -250,6 +250,22 @@ bool menu_display_ctl(enum menu_display_ctl_state state, void *data)
frame_buf->height = *ptr; frame_buf->height = *ptr;
} }
return true; return true;
case MENU_DISPLAY_CTL_FB_DATA:
{
uint16_t **ptr = (uint16_t**)data;
if (!ptr)
return false;
*ptr = frame_buf->data;
}
return true;
case MENU_DISPLAY_CTL_FB_PITCH:
{
size_t *ptr = (size_t*)data;
if (!ptr)
return false;
*ptr = frame_buf->pitch;
}
return true;
case MENU_DISPLAY_CTL_UPDATE_PENDING: case MENU_DISPLAY_CTL_UPDATE_PENDING:
{ {
menu_animation_t *anim = menu_animation_get_ptr(); menu_animation_t *anim = menu_animation_get_ptr();

View File

@ -40,7 +40,9 @@ enum menu_display_ctl_state
MENU_DISPLAY_CTL_WIDTH, MENU_DISPLAY_CTL_WIDTH,
MENU_DISPLAY_CTL_HEIGHT, MENU_DISPLAY_CTL_HEIGHT,
MENU_DISPLAY_CTL_SET_WIDTH, MENU_DISPLAY_CTL_SET_WIDTH,
MENU_DISPLAY_CTL_SET_HEIGHT MENU_DISPLAY_CTL_SET_HEIGHT,
MENU_DISPLAY_CTL_FB_DATA,
MENU_DISPLAY_CTL_FB_PITCH
}; };
typedef struct menu_framebuf typedef struct menu_framebuf