static void flush_head (ply_renderer_backend_t *backend, ply_renderer_head_t *head) { ply_region_t *updated_region; ply_list_t *areas_to_flush; ply_list_node_t *node; ply_pixel_buffer_t *pixel_buffer; char *map_address; assert (backend != NULL); if (!backend->is_active) return; ply_terminal_set_mode (backend->terminal, PLY_TERMINAL_MODE_GRAPHICS); ply_terminal_set_unbuffered_input (backend->terminal); pixel_buffer = head->pixel_buffer; updated_region = ply_pixel_buffer_get_updated_areas (pixel_buffer); areas_to_flush = ply_region_get_sorted_rectangle_list (updated_region); map_address = backend->driver_interface->begin_flush (backend->driver, head->scan_out_buffer_id); node = ply_list_get_first_node (areas_to_flush); while (node != NULL) { ply_list_node_t *next_node; ply_rectangle_t *area_to_flush; area_to_flush = (ply_rectangle_t *) ply_list_node_get_data (node); next_node = ply_list_get_next_node (areas_to_flush, node); if (reset_scan_out_buffer_if_needed (backend, head)) ply_trace ("Needed to reset scan out buffer on %ldx%ld renderer head", head->area.width, head->area.height); ply_renderer_head_flush_area (head, area_to_flush, map_address); node = next_node; } backend->driver_interface->end_flush (backend->driver, head->scan_out_buffer_id); ply_region_clear (updated_region); }
static void add_text_display (ply_boot_splash_plugin_t *plugin, ply_text_display_t *display) { view_t *view; ply_terminal_t *terminal; view = view_new (plugin, display); terminal = ply_text_display_get_terminal (view->display); if (ply_terminal_open (terminal)) { ply_terminal_set_mode (terminal, PLY_TERMINAL_MODE_TEXT); ply_terminal_activate_vt (terminal); } ply_text_display_set_draw_handler (view->display, (ply_text_display_draw_handler_t) on_draw, view); ply_list_append_data (plugin->views, view); }