QNX-Screen官方实例理解+API分析

MAIN

 screen_context_t screen_ctx;
 int flags = SCREEN_APPLICATION_CONTEXT | SCREEN_BUFFER_PROVIDER_CONTEXT;
 screen_create_context(&screen_ctx, flags);

SCREEN_APPLICATION_CONTEXT
允许进程创建自己的窗口并控制某些窗口属性的上下文类型。
应用程序无法修改由其他应用程序创建的窗口,也无法在其进程空间之外发送事件。
应用程序上下文不知道系统中的其他顶级窗口,也不允许对其进行操作。
应用程序上下文可以作为其他窗口的父级,即使它们是在其他进程的其他上下文中创建的,也可以控制这些窗口。
对/dev/screen/.inject具有写访问权限的应用程序上下文可以注入screen事件。
SCREEN_BUFFER_PROVIDER_CONTEXT
一种上下文类型,请求特权上下文以允许进程附加通过调用screen_create_buffer()创建的缓冲区。
除了上下文选择附加的缓冲区之外,上下文不会参与缓冲区的创建。
进程必须具有对/dev/screen/.attach的写访问权限的用户或组ID,才能成功创建此类型的上下文。

screen_create_context
此功能建立与屏幕的通信。
此函数打开/dev/screen并发送正确的连接序列。
如果调用成功,则分配内存以存储上下文状态。Screen创建一个事件队列并将其与连接进程相关联。

Cluster

cluster = new Cluster(screen_ctx, config);
cluster->setNeedleState(has_needle);
cluster->start();

Cluster类

init_bg_window(){
	screen_create_window_type(&bg_screen_win, screen_ctx, SCREEN_APPLICATION_WINDOW | SCREEN_ROOT_WINDOW);
	int usage = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ;
    	screen_set_window_property_iv(bg_screen_win, SCREEN_PROPERTY_USAGE, &usage);
 	int zorder = BG_WINDOW_ZORDER;//0
    	screen_set_window_property_iv(bg_screen_win, SCREEN_PROPERTY_ZORDER, &zorder);
}

SCREEN_APPLICATION_WINDOW

用于显示主应用程序的窗口类型。
其x和y坐标始终与显示器的尺寸相关。

SCREEN_ROOT_WINDOW
用于指示窗口负责使用其组中所有窗口的内容的标志。
Screen使用根窗口执行合成,但不会合成根窗口下面的任何窗口。
此标志必须与一种Screen窗口类型一起在逻辑OR表达式中使用。

screen_create_window_type
此函数创建指定类型的窗口对象。
如果在配置文件中定义了名为“default”的类,则其属性将在创建时应用于窗口

  load_default_bg(){
	load_image_to_window(bg_screen_win, default_bg_path){
	decode_setup_for_window(){
	screen_window_t screen_win = (screen_window_t)data;
    	screen_buffer_t screen_buf;
    	int size[2];
    	size[0] = img->w;
    	size[1] = img->h;
    	screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size);
    	screen_create_window_buffers(screen_win, 1);
    	screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_buf);
    	screen_get_buffer_property_pv(screen_buf, SCREEN_PROPERTY_POINTER, (void **)&img->access.direct.data);
    	screen_get_buffer_property_iv(screen_buf, SCREEN_PROPERTY_STRIDE, (int *)&img->access.direct.stride);
		}
	}
	
}

screen_get_buffer_property_pv
此函数将缓冲区属性的当前值存储在用户提供的缓冲区中。
可以使用此函数检索以下属性的值:
SCREEN_PROPERTY_EGL_HANDLE
SCREEN_PROPERTY_NATIVE_IMAGE
SCREEN_PROPERTY_POINTER
SCREEN_PROPERTY_POINTER
软件渲染器可以使用的指针来读取和/或写入缓冲区。
检索或设置此属性时,请确保有足够的存储空间用于一个空指针。
您必须使用包含SCREEN_use_READ和/或SCREEN_USER_WRITE的用法创建或附加缓冲区,才能使用此属性。

show_default_bg(){

}
run(){
    init_rpm_window();
    init_speed_window();
    init_needle_window();
    load_rpm();
    load_speed();
    show_rpm();
    show_speed();
    load_needle();
}
init_rpm_window(){	
	screen_create_window(&rpm_screen_win, screen_ctx);
	int usage = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ;
	screen_set_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_USAGE, &usage);
	int zorder = RPM_WINDOW_ZORDER;//2
   	screen_set_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_ZORDER, &zorder);
   	int fmt = SCREEN_FORMAT_RGBA8888;
    	screen_set_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_FORMAT, &fmt);

}
init_speed_window(){
	screen_create_window(&speed_screen_win, screen_ctx);
	int usage = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ;
    	screen_set_window_property_iv(speed_screen_win, SCREEN_PROPERTY_USAGE, &usage);
    	int zorder = SPEED_WINDOW_ZORDER;//2
    	screen_set_window_property_iv(speed_screen_win, SCREEN_PROPERTY_ZORDER, &zorder);
    	int fmt = SCREEN_FORMAT_RGBA8888;
    	screen_set_window_property_iv(speed_screen_win, SCREEN_PROPERTY_FORMAT, &fmt);
}
 init_needle_window(){
	screen_create_window(&needle_screen_win, screen_ctx);
	int usage = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ | SCREEN_USAGE_WRITE | SCREEN_USAGE_OPENGL_ES1 | 			SCREEN_USAGE_OPENGL_ES2 | SCREEN_USAGE_OPENGL_ES3;
    	screen_set_window_property_iv(needle_screen_win, SCREEN_PROPERTY_USAGE, &usage);
    	int zorder = NEEDLE_WINDOW_ZORDER;//3
    	screen_set_window_property_iv(needle_screen_win, SCREEN_PROPERTY_ZORDER, &zorder);
    	int fmt = SCREEN_FORMAT_RGBA8888;
    	screen_set_window_property_iv(needle_screen_win, SCREEN_PROPERTY_FORMAT, &fmt);
    	int size[2] = {NEEDLE_WINDOW_W, NEEDLE_WINDOW_H};
    	screen_set_window_property_iv(needle_screen_win, SCREEN_PROPERTY_SIZE, size);
    	int interval = 1;
    	screen_set_window_property_iv(needle_screen_win, SCREEN_PROPERTY_SWAP_INTERVAL, &interval);
    	int pos[] = {0, 0};
    	screen_set_window_property_iv(needle_screen_win, SCREEN_PROPERTY_POSITION , pos);
    	int nbuffers = 2;           /* Number of window buffers */
    	screen_create_window_buffers(needle_screen_win, nbuffers);

}

SCREEN_PROPERTY_SWAP_INTERVAL
一个整数,用于指定发布之间的最小vsync周期数。
检索或设置此属性类型时,请确保有足够的存储空间用于一个整数。
screen_create_window_buffers
此函数为窗口分配缓冲区。缓冲区的创建大小为窗口设置的SCREEN_PROPERTY_BUFFER_SIZE。
在调用此函数之前,请确保在窗口上设置了SCREEN_PROPERTY_USAGE属性,以指示窗口缓冲区的预期用途。
例如,要从缓冲区中检索SCREEN_PROPERTY_POINTER,必须在调用screen_create_window_buffers之前,将SCREEN_PROCPERTY_USAGE_READ属性设置为在窗口中包含SCREEN_USEE_READ和/或SCREEN_USER_WRITE标志。

 load_rpm(){
	 int rc = load_image_to_window(rpm_screen_win, rpm_path);
}
load_speed(){
	int rc = load_image_to_window(speed_screen_win, speed_path);
}
    show_rpm(){
	 screen_buffer_t screen_buf;
	 int rect[4] = { 0, 0, 0, 0 };
	 screen_get_window_property_pv(rpm_screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_buf);
    	 screen_get_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_BUFFER_SIZE, rect+2);
    	 int viewport_size[2] = { 0, 0 };
    	 viewport_size[0] = rect[2];
    	 viewport_size[1] = rect[3];
    	 screen_set_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_SOURCE_SIZE , viewport_size);
    	 int pos[] = {100, 60};
    	 screen_set_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_POSITION , pos);
    	 int transmode = SCREEN_TRANSPARENCY_SOURCE_OVER;
    	 screen_set_window_property_iv(rpm_screen_win, SCREEN_PROPERTY_TRANSPARENCY, &transmode);
    	 screen_post_window(rpm_screen_win, screen_buf, 1, rect, SCREEN_WAIT_IDLE);
}

screen_get_window_property_pv
此函数检索窗口属性的值并将其存储在用户提供的缓冲区中。可以使用此函数查询以下属性的值:
SCREEN_PROPERTY_RENDER_BUFFERS
可用于渲染的一个或多个缓冲区的句柄。
检索此属性类型时,请确保根据API对象类型提供足够的存储空间。
pixmap:一个pixmap对象只允许一个缓冲区。检索像素图的此属性时,请确保有足够的存储空间用于一个空指针。
流:多个缓冲区可用于渲染流对象。在检索流的SCREEN_PROPERTY_RENDER_BUFFERS时,请确保每个可用缓冲区有足够的存储空间用于一个空指针。
使用SCREEN_PROPERTY_RENDER_BUFFER_COUNT属性确定可用于渲染的缓冲区数。
window:多个缓冲区可用于渲染窗口对象。检索窗口的SCREEN_PROPERTY_RENDER_BUFFERS时,请确保每个可用缓冲区都有足够的存储空间用于一个空指针。
使用SCREEN_PROPERTY_RENDER_BUFFER_COUNT属性确定可用于渲染的缓冲区数。
SCREEN_PROPERTY_TRANSPARENCY
定义API对象透明度类型的单个整数。
检索或设置此属性类型时,请确保有足够的存储空间用于一个整数。
适用于以下Screen API对象:
display:如何组合多个图层。适用于显示对象的透明度包括:
SCREEN_TRANSPARENCY_SOURCE_COLOR
SCREEN_TRANSPARENCY_SOURCE_OVER
此属性只能检索,不能为显示设置。
window:如何使用窗口的alpha通道将窗口与其他窗口或其下的背景色组合。虽然可以设置窗口透明度属性,但实际应用的透明度取决于硬件。
如果硬件支持,则应用此属性指定的透明度,否则使用尽力而为算法应用窗口透明度。
当您将SCREEN_property_FORMAT设置为带alpha的格式(例如,SCREEN_FORMAT_RGBA4444)时,为了方便起见,此属性设置为SCREEN_TRANSPARENCY_SOURCE_OVER。因此,如果这不是您的意图,那么我们建议您使用忽略alpha通道的像素格式类型(例如,SCREEN_format_RGBX4444)。
screen_post_window
此函数使渲染缓冲区中的一些像素可见。要发布的像素由dirty_rects参数中包含的脏矩形定义。请注意,在至少调用一次screen_post_window()之前,窗口将不可见。
除了dirty_rects定义的区域外,Screen还可以更新缓冲区中的其他像素(即,使用dirty_rect作为指导,Screen发布整个缓冲区)。因此,应用程序必须确保窗口缓冲区的全部内容始终适合显示。
不需要使用多线程或应用程序缓冲区管理方案以全显示帧速率进行渲染,因为与其他图形系统中的等效调用不同,screen_post_window()并不总是阻塞。
此函数可能会导致过帐窗口的SCREEN_PROPERTY_RENDER_BUFFERS属性发生更改。任何时候,只有一个线程必须对该窗口进行操作或渲染到该窗口。如果应用程序使用多个线程,则必须确保这些线程对该窗口句柄的访问受到保护。如果没有,SCREEN_PROPERTY_RENDER_BUFFERS可能会反映可能导致动画瑕疵的过期信息。新内容的呈现可能导致复制或缓冲区翻转,这取决于合成窗口系统选择如何执行操作。使用窗口属性SCREEN_property_RENDER_BUFFER_COUNT确定可用于渲染的缓冲区数量。

    show_speed(){
	screen_buffer_t screen_buf;
    	int rect[4] = { 0, 0, 0, 0 };
    	screen_get_window_property_pv(speed_screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_buf);
    	screen_get_window_property_iv(speed_screen_win, SCREEN_PROPERTY_BUFFER_SIZE, rect+2);
    	int viewport_size[2] = { 0, 0 };
    	viewport_size[0] = rect[2];
    	viewport_size[1] = rect[3];
    	screen_set_window_property_iv(speed_screen_win, SCREEN_PROPERTY_SOURCE_SIZE , viewport_size);
    	int pos[] = {1220, 60};
    	screen_set_window_property_iv(speed_screen_win, SCREEN_PROPERTY_POSITION , pos);
    	int transmode = SCREEN_TRANSPARENCY_SOURCE_OVER;
    	screen_set_window_property_iv(speed_screen_win, SCREEN_PROPERTY_TRANSPARENCY, &transmode);
    	screen_post_window(speed_screen_win, screen_buf, 1, rect, SCREEN_WAIT_IDLE);+
    	
}
    load_needle(){	
	 screen_create_pixmap(&needle_screen_pix, screen_ctx);
	 int usage = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ;
    	 screen_set_pixmap_property_iv(needle_screen_pix, SCREEN_PROPERTY_USAGE, &usage);
    	 int fmt = SCREEN_FORMAT_RGBA8888;
    	 screen_set_pixmap_property_iv(needle_screen_pix, SCREEN_PROPERTY_FORMAT, &fmt);
    	 load_image_to_pixmap(needle_screen_pix, needle_path)
    	 screen_buffer_t screen_pbuf;
    	screen_get_pixmap_property_pv(needle_screen_pix, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_pbuf);
    	int size[2];
    	screen_get_buffer_property_iv(screen_pbuf, SCREEN_PROPERTY_BUFFER_SIZE, size);
    	void *needle_data = NULL;
       screen_get_buffer_property_pv(screen_pbuf, SCREEN_PROPERTY_POINTER, &needle_data);
}

screen_create_pixmap
此函数创建一个pixmap对象,它是一个屏幕外渲染目标。稍后可以将此渲染的结果复制到窗口对象。当不再使用像素映射时,应用程序必须使用screen_destroy_pixmap()。

SdCast

 QNX_SdCast *cast = new QNX_SdCast(screen_ctx, config);
 cast->setStoreBufferState(has_store);
 cast->start();

QNX_SdCast类

screen_create_window(&ds_screen_win, screen_ctx);	
int usage = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ | SCREEN_USAGE_WRITE;
screen_set_window_property_iv(ds_screen_win, SCREEN_PROPERTY_USAGE, &usage);
int zorder = DS_WINDOW_ZORDER;//1
screen_set_window_property_iv(ds_screen_win, SCREEN_PROPERTY_ZORDER, &zorder);

screen_create_window
此函数用于创建窗口对象。它相当于调用类型为SCREEN_APPLICATION_WINDOW screen_create_window_type()。
==SCREEN_USAGE_NATIVE ==
用于指示与API对象关联的缓冲区可用于本机API操作的标志。
如果使用blits(screen_blit())或fills(screen_fill()),则必须在缓冲区上设置此标志。
SCREEN_USAGE_READ
指示CPU可以从与API对象相关联的缓冲区中读取的标志。
SCREEN_USAGE_WRITE
指示CPU可以写入与API对象关联的缓冲区的标志。
SCREEN_PROPERTY_USAGE
一个整数,它是一个位掩码,指示与API对象关联的缓冲区的预期用途。缓冲区的默认用法是SCREEN_USE_READ|SCREEN_USER_WRITE。
SCREEN_PROPERTY_USAGE必须是屏幕使用标志类型的组合。
检索或设置此属性类型时,请确保有足够的存储空间用于一个整数。
请注意,当添加或删除覆盖使用位(SCREEN_USAGE_OVERLAY)时,更改SCREEN_PROPERTY_USAGE会影响管道。
SCREEN_PROPERTY_ZORDER
[INT_MIN,INT_MAX]范围内的一个整数,表示在对API对象进行排序时使用的距离(从底部)。
检索或设置此属性类型时,请确保有足够的存储空间用于一个整数。
会话:一个窗口可以有多个输入会话。当这些多个会话的区域重叠时,此属性用于确定哪个会话位于顶部。SCREEN_PROPERTY_ZORDER最高的会话是接收输入事件的会话。
window:窗口的z顺序相对于其父窗口。例如,正值将子窗口放置在其关联父窗口的顶部(或上方)。相反,负z顺序将子窗口置于父窗口之下。z顺序没有与之关联的单位。在系统中有窗口管理器的情况下,应用程序窗口的z顺序相对于0。

screen_set_window_property_iv
此函数用于从用户提供的缓冲区设置窗口属性的值。您可以使用此函数设置以下属性的值:

SCREEN_PROPERTY_ALPHA_MODE 
SCREEN_PROPERTY_BRIGHTNESS 
SCREEN_PROPERTY_BUFFER_SIZE 
SCREEN_PROPERTY_CBABC_MODE 
SCREEN_PROPERTY_CLIP_POSITION 
SCREEN_PROPERTY_CLIP_SIZE 
SCREEN_PROPERTY_COLOR 
SCREEN_PROPERTY_COLOR_SPACE 
SCREEN_PROPERTY_CONTRAST 
SCREEN_PROPERTY_DEBUG 
SCREEN_PROPERTY_FLIP 
SCREEN_PROPERTY_FLOATING 
SCREEN_PROPERTY_FORMAT 
SCREEN_PROPERTY_GLOBAL_ALPHA 
SCREEN_PROPERTY_HUE 
SCREEN_PROPERTY_IDLE_MODE 
SCREEN_PROPERTY_MIRROR 
SCREEN_PROPERTY_PERMISSIONS 
SCREEN_PROPERTY_PIPELINE 
SCREEN_PROPERTY_POSITION 
SCREEN_PROPERTY_PROTECTION_ENABLE 
SCREEN_PROPERTY_ROTATION 
SCREEN_PROPERTY_SATURATION 
SCREEN_PROPERTY_SCALE_FACTOR 
SCREEN_PROPERTY_SCALE_QUALITY 
SCREEN_PROPERTY_SELF_LAYOUT 
SCREEN_PROPERTY_SENSITIVITY 
SCREEN_PROPERTY_SENSITIVITY_THRESHOLD 
SCREEN_PROPERTY_SIZE 
SCREEN_PROPERTY_SOURCE_CLIP_POSITION 
SCREEN_PROPERTY_SOURCE_CLIP_SIZE 
SCREEN_PROPERTY_SOURCE_POSITION 
SCREEN_PROPERTY_SOURCE_SIZE 
SCREEN_PROPERTY_STATIC 
SCREEN_PROPERTY_STATUS 
SCREEN_PROPERTY_SWAP_INTERVAL 
SCREEN_PROPERTY_TRANSPARENCY 
SCREEN_PROPERTY_USAGE 
SCREEN_PROPERTY_VIEWPORT_POSITION 
SCREEN_PROPERTY_VIEWPORT_SIZE 
SCREEN_PROPERTY_VISIBLE 
SCREEN_PROPERTY_ZORDER

返回0是成功,-1 产生错误 errno set errno.h有详细说明

update(){	

}

版权声明:本文为weixin_40822211原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>