SCREEN编程基本步骤
这里以高通8155软件基线中的ssplash应用为例进行分析。
基本流程:
介绍这些步骤我们会从why 和 how两个维度来介绍screen应用编程中的两个问题:为什么要这么做?如何做?
1,等待/dev/screen节点
why:screen应用依赖于screen服务,所以必须要等待screen 服务ready.
how:可以使用waitfor或者waitfor_attach接口来等待screen目录节点生成(screen目录节点生成意味着screen服务已经ready),例如下面就是使用的waitfor_attach接口等待screen服务ready,超时时间为5000ms.
/*Wait till "/dev/screen" shows up */
waitfor_attach ( "/dev/screen", 5000 );
2,创建screen context
why:所有的screen API接口(除了screen events事件)都需要通过context与screen server进行交互,所以screen编程的第一步就需要创建screen context来建立application与screen之间的连接.
how:请参考下面的代码,接口需要的参数flag中有多种类型可选,普通screen应用选择SCREEN_APPLICATION_CONTEXT,如果需要power on display则还需要设置SCREEN_POWER_MANAGER_CONTEXT,这两个flag所包含的意思是:这是一个application级别的screen程序,拥有power on display的权限.其他的flag信息可以参考开发者手册中的Screen context types章节.
screen_context_t screen_ctx;
/*Create a screen context*/
if ( EOK != ( rc = screen_create_context(&screen_ctx,
SCREEN_APPLICATION_CONTEXT |
SCREEN_POWER_MANAGER_CONTEXT )))
{
ERROR("screen_create_context(0x%x) failed, err=%d",
SCREEN_APPLICATION_CONTEXT|SCREEN_POWER_MANAGER_CONTEXT,
errno);
goto exit1;
}
3,创建render target
why: 可以理解为你想要经过screen 渲染的目标,这个target如果需要显示在屏幕上那通常就是一个窗口window,如果不需要显示在屏幕上则可以是stream/pixmap.
how:参考下面的例子,创建windows实例.
/*Create a window on which we will show the splash*/
if ( EOK != ( rc = screen_create_window(&screen_win, screen_ctx))) {
ERROR("create win failed, err=%d", errno ) ;
goto exit3;
}
4,设置target属性
why:类似于framebuffer编程,需要对你想要显示的target配置参数,比如显示的位置,大小,alpha等等.
how:参考下面的例子.
if ( EOK != ( rc = screen_get_window_property_iv(screen_win,
SCREEN_PROPERTY_BUFFER_SIZE, rect+2)))
{
ERROR("GET SCREEN_PROPERTY_SIZE failed, err=%d", errno);
goto exit4;
}
position[0] = dims[0]/2 - rect[2]/2;
position[1] = dims[1]/2 - rect[3]/2;
if ( EOK != ( rc = screen_set_window_property_iv(screen_win,
SCREEN_PROPERTY_POSITION , position )))
{
ERROR("SET SCREEN_PROPERTY_POSITION failed, err=%d", errno);
goto exit4;
}
if ( EOK != ( rc = screen_set_window_property_iv(screen_win,
SCREEN_PROPERTY_STATIC , &static_content)))
{
ERROR("SET SCREEN_PROPERTY_STATIC failed, err=%d", errno);
goto exit4;
}
5,创建render buffer
why:用于存放要显示的图像数据内容
how:参考下面的代码
/*Create one buffer*/
if (EOK != (rc = screen_create_window_buffers(screen_win, 1))){
ERROR("screen_create_window_buffers(1) failed, err=%d", errno);
goto error;
}
6,render target
why:render可能是screen中最复杂的一部分,这里的render有多种实现的方式,也有多种多样的操作,比如对画面进行re-size,使用GPU对画面的内容数据进行渲染修改等等
how:参考开发者手册中的 Chapter 3 Rendering
7,推送render后的数据
why:推送render后的数据到屏幕上
how:参考下面代码
/*Final call to post the window*/
if (EOK != ( rc = screen_post_window(screen_win,
screen_buf, 1, rect, 0)))
{
ERROR("screen_post_window failed, err=%d",errno);
goto exit4;
}
8,处理input事件(如果有需要的话)