QNX-Screen官方文档理解(Application Development)

简介

QNX屏幕图形子系统基于客户机/服务器模型,其中应用程序是向服务器(屏幕)请求图形服务的客户机。它包括一个复合窗口系统作为这些服务之一,这意味着所有的应用程序呈现都在屏幕外缓冲区上执行,然后可以稍后用于更新显示。

Screen支持硬件渲染加速和合成,也支持软件渲染。兼容显示控制器,2D\3D加速器和输入设备

Screen API

除了事件之外,所有Screen API组件都必须与上下文关联。所有Screen应用程序的第一步是创建Screen上下文。例如:

screen_context_t screen_ctx;    
screen_create_context(&screen_ctx, SCREEN_APPLICATION_CONTEXT);

此上下文在应用程序和Screen之间建立连接。如果没有这个连接,您的应用程序就不能与Screen通信以访问任何功能。
Screen API components
Buffer
缓冲区是存储像素数据的内存区域。尽管可以在上下文范围内创建缓冲区,但除非将它附加到窗口、流或像素图,否则Screen不能使用它。
多个缓冲区可以与窗口或流相关联,但只有一个缓冲区可以与位图相关联。
Context
上下文为窗口环境中的图形操作提供设置。
除了事件之外,所有其他API对象都是在上下文范围内创建的,对这些对象的访问总是与与对象关联的上下文相关。您可以识别并访问对象(例如,窗口、组、显示、像素图),以设置或更改它们的属性和属性。
设备、显示和窗口依赖于上下文,而上下文与事件、组和像素图直接相关。
Device
设备是指输入设备。这种输入设备(如键盘、鼠标、操纵杆、手柄和多点触控)可以与特定的显示器相关联。
Display
显示器是指一种物理设备,如触摸屏或物理屏幕,向观众呈现图像。使用特定于显示的API组件,您可以获得对显示属性的访问。这些属性包括供应商、显示技术和视频模式等信息。
Event
事件包括窗口创建、设置属性、键盘事件和触摸事件等操作。屏幕API为每个上下文管理一个事件队列。但是,可以独立于与上下文的任何关联创建事件。
Group
组用于组织和管理应用程序中的多个窗口。组在属于同一组的窗口的属性之间建立继承关系;因此,对窗口组的某些属性应用更改会对属于该组的所有窗口产生影响。父窗口创建一个组,以便子窗口可以加入。子窗口继承其父窗口的属性,但也具有可以独立于其父窗口进行设置和检索的属性。
Pixmap
像素图是屏幕外渲染目标。它的内容只能通过将其复制到窗口缓冲区来显示。这可以通过使用原生的blit Screen API函数来实现,或者使用像素图作为OpenGL ES纹理。
Session
输入会话允许应用程序控制如何将原始事件处理为更高级别的事件。会话允许您的应用程序捕获特定于特定区域、设备或屏幕事件类型的事件;它为您提供了比单独通过Windows所能实现的更多的对输入事件分派的控制。
Stream
流允许组件生成和处理图形化内容。对于流,没有必要将图形内容与显示相关联。内容可以由Screen以外的其他组件使用。但是,这些组件仍然可以使用Screen来显示内容。
Window
窗口表示其内容为显示目标的绘图面。有多种类型的窗口(应用程序窗口、子窗口和嵌入式窗口)来适应要显示的内容的组织。
eg:

#include <stdio.h>
#include <stdlib.h>
#include <screen/screen.h>
int main(void){   
 int err = 0;    
 screen_context_t   
 screen_context = 0;    
 screen_window_t    
 screen_window = 0;
    err = screen_create_context(&screen_context, SCREEN_APPLICATION_CONTEXT);    
    if(err != 0){       
     printf("Failed to create screen context\n");    }
    err = screen_create_window(&screen_window, screen_context);    if(err != 0){            
    printf("Failed to create screen window\n");    }
    int usage = SCREEN_USAGE_READ | SCREEN_USAGE_WRITE;    
    err = screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_USAGE, &usage);    
    if(err != 0){           
     printf("Failed to set usage property\n");    }
    // set screen format to RGBA8888, 0xAARRGGBB   
     int screenFormat = SCREEN_FORMAT_RGBA8888;    screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_FORMAT, &screenFormat);   
      if(err != 0){           
       printf("Failed to set format property\n");   
        }
#if 1   
 // set screen z ordor to 10, 0 is bottom, n(>0) is top    
 int zorder = 15;    
 screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_ZORDER, &zorder);   
  if(err != 0){            
  printf("Failed to set zorder property\n");    }
  #endif
    err = screen_create_window_buffers(screen_window, 1);    if(err != 0){            
    printf("Failed to create window buffer\n");   
     }
    int buffer[2];   
     err = screen_get_window_property_iv(screen_window, SCREEN_PROPERTY_BUFFER_SIZE, buffer);  
       if(err != 0){            
       printf("Failed to get window buffer size\n");   
        }
    screen_buffer_t screen_buf;   
     err = screen_get_window_property_pv(screen_window, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_buf);    
     if(err != 0){           
      printf("Failed to get window buffer\n");   
       }
    int *ptr = NULL;    
    err = screen_get_buffer_property_pv(screen_buf, SCREEN_PROPERTY_POINTER, (void **)&ptr);   
     if(err != 0){           
      printf("Failed to get buffer pointer\n");   
       }
    int stride = 0;   
     err = screen_get_buffer_property_iv(screen_buf, SCREEN_PROPERTY_STRIDE, &stride);    
     if(err != 0){            
     printf("Failed to get buffer stride\n");   
      }
    // clear screen   
     memset(ptr, 0x00, buffer[0]*buffer[1]*4);//字节
    // 0xAARRGGBB    
    // line 0 to 1/4:   0xFFFF0000    
    // line 1/4 to 2/4: 0xFF00FF00    
    // line 2/4 to 3/4: 0x000000FF    
    // line 3/4 to 1:   0x660000FF    
    int one_quarter = buffer[1]/4;   
     for(int i = 0; i < buffer[1]; ++i, ptr+=(stride/4))
     {        for(int j = 0; j < buffer[0]; j++ )
     {           
      if (i < one_quarter)                
      ptr[j] = 0xFFFF0000;            
      else if (i < one_quarter*2)                
      ptr[j] = 0xFF00FF00;            
      else if (i < one_quarter*3)               
       ptr[j] = 0x000000FF;            
       else               
        ptr[j] = 0x660000FF;        
        }    
        }
    err = screen_post_window(screen_window, screen_buf, 0, NULL, 0);    
    if(err != 0){           
     printf("Failed to post window\n");    
     }
    /* Trap execution */   
     while(1);
    screen_destroy_window(screen_window);    screen_destroy_context(screen_context);
    return EXIT_SUCCESS;
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值