static int m_display_present(lua_State * L) { struct ldisplay_t * display = luaL_checkudata(L, 1, MT_DISPLAY); cairo_t * cr; if(display->showfps) { char buf[32]; ktime_t now = ktime_get(); s64_t delta = ktime_ms_delta(now, display->stamp); if(delta > 0) display->fps = ((double)1000.0 / (double)delta) * 0.618 + display->fps * 0.382; display->frame++; display->stamp = now; cr = display->cr[display->index]; cairo_save(cr); cairo_set_font_size(cr, 24); cairo_set_source_rgb(cr, 0.4, 0.4, 0.4); cairo_move_to(cr, 0, 24); snprintf(buf, sizeof(buf), "%.2f %d", display->fps, display->frame); cairo_show_text(cr, buf); cairo_restore(cr); } cairo_xboot_surface_present(display->cs[display->index]); display->index = (display->index + 1) % 2; cr = display->cr[display->index]; cairo_save(cr); cairo_set_source_rgb(cr, 1, 1, 1); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); cairo_restore(cr); return 0; }
static int m_display_gc(lua_State * L) { struct ldisplay_t * display = luaL_checkudata(L, 1, MT_DISPLAY); cairo_xboot_surface_present(display->alone); cairo_surface_destroy(display->alone); cairo_destroy(display->cr[0]); cairo_destroy(display->cr[1]); cairo_surface_destroy(display->cs[0]); cairo_surface_destroy(display->cs[1]); return 0; }
void display_present(struct display_t * disp, void * o, void (*draw)(struct display_t *, void *)) { cairo_t * cr; struct region_t rn, ro, * r; char fps[32]; int count; int i; if(disp) { if(disp->cursor.show && disp->cursor.dirty) { region_init(&rn, disp->cursor.nx, disp->cursor.ny, disp->cursor.width, disp->cursor.height); region_init(&ro, disp->cursor.ox, disp->cursor.oy, disp->cursor.width, disp->cursor.height); display_region_list_add(disp, &rn); display_region_list_add(disp, &ro); disp->cursor.dirty = 0; } if(disp->fps.show) { ktime_t now = ktime_get(); s64_t delta = ktime_ms_delta(now, disp->fps.stamp); if(delta > 0) disp->fps.rate = ((double)1000.0 / (double)delta) * 0.618 + disp->fps.rate * 0.382; disp->fps.frame++; disp->fps.stamp = now; int len = snprintf(fps, sizeof(fps), "%.2f %ld", disp->fps.rate, disp->fps.frame); region_init(&rn, 0, 0, len * (24 / 2), 24); display_region_list_add(disp, &rn); } if((count = disp->rl->count) > 0) { cr = disp->cr; cairo_reset_clip(cr); for(i = 0; i < count; i++) { r = &disp->rl->region[i]; cairo_rectangle(cr, r->x, r->y, r->w, r->h); } cairo_clip(cr); cairo_save(cr); cairo_set_source_rgb(cr, 1, 1, 1); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_paint(cr); cairo_restore(cr); if(draw) draw(disp, o); #if 0 { static int flag = 0; cairo_save(cr); flag = !flag; if(flag) cairo_set_source_rgba(cr, 1, 0, 0, 0.7); else cairo_set_source_rgba(cr, 0, 1, 0, 0.7); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_paint(cr); cairo_restore(cr); } #endif if(disp->cursor.show) { cairo_save(cr); cairo_set_source_surface(cr, disp->cursor.cs, disp->cursor.nx, disp->cursor.ny); cairo_paint(cr); cairo_restore(cr); } if(disp->fps.show) { cairo_save(cr); cairo_set_font_size(cr, 24); cairo_set_source_rgb(cr, 0.4, 0.4, 0.4); cairo_move_to(cr, 0, 24); cairo_show_text(cr, fps); cairo_restore(cr); } cairo_xboot_surface_present(disp->cs, disp->rl); } } }