示例#1
0
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;
}
示例#2
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;
}
示例#3
0
文件: display.c 项目: xboot/xboot
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);
		}
	}
}