SCREEN基本编程

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事件(如果有需要的话)

参考

https://blog.csdn.net/suixing_yuan/category_10911939.html

QNX 7.0 SCREEN开发者手册_norlan_jame的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/kill150/article/details/131192882