英文源文地址: https://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt ,本文仅做简单翻译,获得对XRandR的大致了解。

一、引言

    X 协议中Resize,Rotate和Reflect扩展,简称RandR,可以调整大小,旋转和反射屏幕的根窗口。它基于2001年Usenix技术会议论文集[RANDR]中规定的X调整大小和旋转扩展。
   实现并集成到X服务器中的RandR与该论文中讨论的设计有很大不同:即,RandR 1.0不实现该文档中描述的深度切换功能,并且文档和实现中对于协议描述的支持,已经这儿的协议描述中去除了,被其他事件所取代。
    这些事件包括:
      ►现代工具包(在本例中为GTK + 2.x)已经发展到了可以在任意深度的屏幕之间实现移植的程度
   ►摩尔定律的不断发展使得VRAM数量的限制不再成为一个问题,减少了在笔记本电脑或台式机系统上实现深度切换的压力
   ►需要针对深度切换的设计,来支持迁移的传统工具包持续衰落
   ►由于我们无法控制的事件,在此期间缺乏深度切换实现经验
    此外,支持深度切换的需求使重新设计X server上的设备独立部分变得复杂。
    不能为了社区一直想要的特性,进一步推迟RandR的广泛部署(调整屏幕大小,特别是在笔记本电脑上),或者部署可能缺乏实现经验而存在缺陷的协议,我们决定从协议中删除深度切换。如果条件允许,我们可能会在以后作为协议的修订实现,这样仍然可以保持应用程序有一个稳定的基础。这里描述的协议已经在主要的X.org服务器中实现,并且在分发的hw / kdrive实现中更加完善,完全实现了调整大小,旋转和映射。
1.2 扩展协议的1.2版本简介
    RandR协议版本1.1中发现的一个重要限制是无法处理Xinerama模型,其中多个显示器只显示公共底层屏幕的一部分。在这种环境中,零个或多个视频输出与每个CRT控制器相关联,该控制器定义一组视频定时和较大屏幕内的“视口(viewport)”。 此视口独立于屏幕的整体大小,可能位于屏幕内的任何位置。
    这样做的影响是将屏幕尺寸与每个视频输出显示的尺寸分离,并允许多个输出在同一个屏幕上显示信息。
    为了扩展RandR,我们将输出、CRTC和屏幕配置信息分开,并允许它们单独配置。为了与协议的1.1版本兼容,我们使1.1请求同时影响屏幕和(可能是唯一的)CRTC和输出。可用输出集以UTF-8编码的名称呈现,并且可以在底层硬件允许的情况下连接到CRTC。 CRTC配置现在使用完整模式信息而不仅仅是大小和刷新率,每个模式都有名字。这些名称也使用UTF-8编码。用户也可以添加新模式。
    为此新功能提供了其他请求和事件。
                              
    在上图中,屏幕被两个CRTC覆盖(不完整)。CRTC1连接到两个输出A和B.CRTC2连接到输出C。输出A和B将使用相同的模式行呈现完全相同的屏幕区域。输出C将使用不同的模式行,呈现不同(更大)的屏幕区域。
RandR提供每个可用CRTC和输出的相关信息;CRTC和输出之间的连接处于应用程序控制之下,尽管硬件可能会对配置施加限制。该协议不会试图描述这些限制,而是提供了一种机制来找出支持的组合。
1.3 扩展协议的1.3版本简介
 
   版本1.3基于1.2做更改,并添加了一些新功能,不需要从根本上改变扩展。 此版本中添加了以下功能:
     •投影变换。一般旋转支持的实现工作使得添加完整的投影变换变得微不足道。这些可以用于缩放屏幕以及执行投影原则校正等。
     •平移。它被RandR 1.2删除了,因为旧的语义不再适用。使用RandR 1.3可以在每个crtc上指定平移。 
1.4扩展协议的1.4版本简介
    版本1.4添加了可选的Border属性。
    •可选的Border属性。此属性允许客户端指定CRTC的视口小于在模式中描述的活跃显示区域。例如,这对于补偿某些电视的过扫描行为很有用。
   1.4版添加了一个新对象:a provider object。提供者对象代表向X服务器提供服务的GPU或虚拟设备。提供者具有一系列能力和一组可能的角色。
   提供者对象用于控制多GPU系统。可以动态配置提供者角色以提供以下支持:
    1)输出从属:插入USB设备,但使用主GPU渲染其输出。在一些双GPU笔记本电脑上,第二个GPU未连接到LVDS面板,因此我们需要将第一个GPU用作第二个GPU的输出从属设备。
    2)卸载 - 对于双GPU笔记本电脑,允许直接渲染的应用程序在第二个GPU上运行并在第一个GPU上显示。
    3)GPU切换 - 允许主屏幕渲染器在两个GPU之间切换。
    4)多GPU渲染 - 取代Xinerama。 
1.5. 扩展协议的1.5版本简介
   1.5版为输出添加了一个可选的TILE属性。
   •可选的TILE属性。此属性用于表示平铺显示器配置中的各个tile,通过DisplayID v1.3公开。
   1.5版添加了monitor(下面翻译为监视器):
    •“monitor”是屏幕的矩形子集,表示呈现给用户的一系列像素集合。
    •每个监视器都与输出列表相关联(可能为空)。
    •客户端定义监视器时,将从现有监视器中删除关联的输出。如果删除导致该监视器的列表变空,则将删除该监视器。
对于没有与任何客户端定义的监视器关联的输出的CRTC,当第一个输出与之关联,将会自动定义一个服务器定义的监视器。
    •定义监视器时,将几何设置为全零将使该监视器动态跟踪与其关联的活动输出的边界。
   此新对象将硬件的物理配置从屏幕的逻辑子集分离开,应用程序应考虑单个可视区域。 
1.5.1.监视器与Xinerama之间的关系
   Xinerama的信息现在来自监视器,而不是直接来自CRTC。标记为Primary的监视器将首先列出。
1.5.2. 输出的生命周期说明
   随着DisplayPort multistream(MST)的引入,动态连接器的实现变成了可能,当RandR输出消失时,许多RandR客户端无法处理XID BadMatch。这说明X服务器不会动态删除输出,只需将它们标记为断开连接即可。
二、屏幕更改模型

   屏幕可能会在此扩展程序的控制下或由于外部事件而动态更改。包括:交换监视器,按下按钮以从内部显示器切换到外部笔记本电脑上的监视器,热插拔的显卡都在总线上,例如Cardbus或允许热插拔的Express Card(除此扩展外还需要额外工作)。
   由于屏幕配置是动态的且与客户端异步,可能随时被更改,RandR提供一种机制确保您的客户端查看最新的可行配置,并强制执行希望控制配置的应用程序以证明其在履行更改屏幕配置的请求之前,信息是最新的(通过在请求中增加一个时间戳)。
   每当屏幕配置发生变化时,都会通知感兴趣的应用程序,提供屏幕的当前大小和子像素顺序,以确保显示子像素渲染和时间戳的正确性。客户端在更改配置前必须刷新对屏幕配置的了解,然后才能在通知后尝试更改配置,否则请求将失败。 
   为避免方向,反射和尺寸之间的乘法爆炸,尺寸仅为正常旋转中的尺寸。旋转和反射以及它们如何相互作用可能会令人困惑。在Randr中,坐标系相对于法线方向以逆时针方向旋转。反射是沿着窗口系统坐标系,而不是物理屏幕X和Y轴,因此旋转和反射不会相互作用。考虑反射的另一种方法是在旋转之前在“常规”方向中指定,如果感觉其他方式令人困惑。
   我们希望大多数客户端和工具包都对屏幕结构体的更改都是透明的,因为它们通常直接使用连接显示结构中的值。通过工具包动态更新,我们相信弹出菜单和其他弹出窗口将在屏幕配置更改时也能正确定位(问题是确保弹出窗口在重新配置的屏幕上可见)。
 
三、 数据类型
   子像素顺序和变换数据类型与Render扩展共享,并在那里记录。
   原始扩展中定义的唯一数据类型是屏幕大小,以正常(0度)方向定义。 在以后的版本中添加了几个。

转载于:https://www.cnblogs.com/italysue/p/10130259.html

X协议调整大小、旋转和反射的扩展(The X Resize, Rotate and Reflect Extension )相关推荐

  1. 2021-03-21 jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦),常用的有http,file,ftp等等

    jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦):常用的有http,file,ftp等等.并没有提供对classpath和servletContext中的资源的获取方法. ht ...

  2. Axure谷歌浏览器Chrome扩展程序下载地址:Axure RP Extension For Chrome 0.62

    Axure谷歌浏览器Chrome扩展程序下载地址:Axure RP Extension For Chrome 0.62 如添加扩展 失败. 可以将crx文件后缀改成压缩包后缀如zip,然后解压. 然后 ...

  3. 如何通过反射调用扩展方法?

    在某日回答MSDN客户问题的时候,碰到了一道对我而言新奇的题目(大牛们不要嘲笑俺,可能我少见多怪,写此文算是给出道着们遇到此类问题提一个醒) 题目如下: var list=new List<st ...

  4. 二维图形的基本几何变换:平移、比例、旋转、反射、错切

    1.有关变换 1.1平移变换 rigid-body transformation不产生形变的移动物体的刚体变换,为P点沿着直线从一个坐标位置到另一个坐标位置的过程,例图: 推导过程: 结果的平移变换矩 ...

  5. OSPF协议介绍➌(认证、汇总扩展、LSDB的保护特性、缺省路由、附录E、选路规则、SPF算法、NP+E位、FA地址)

    高清图已传到我的资源里,欢迎下载阅览.

  6. swift. 扩展类添加属性_Swift中用到extension的一些基本的扩展功能讲解

    现有的类,结构或枚举类型的功能可以在扩展的帮助下加入.类型的功能可以使用扩展加入,但重写的功能不能使用扩展. Swift 扩展功能: 添加计算属性并计算类型属性 定义实例和类型的方法 提供了新的初始化 ...

  7. php 扩展加载顺序,关于PHP中extension加载顺序问题的解决方法

    有的php扩展,加载是有先后顺序的,如果搞错了,会导致扩展无法加载. 1.pdo_sqlsrv是sqlserver扩展,如果在pdo扩展之前加载就会报以下错误:PHP Warning: PHP Sta ...

  8. opencv图像旋转和翻转,cv2.flip,cv2.rotate

    目录 翻转图像 图像旋转 翻转图像 opencv中使用cv2.filp可以实现图像翻转 def flip(src, flipCode, dst=None) src:输入图像 flipCode:flip ...

  9. php rrdtool,PHP配置rrdtool扩展 (How to build the PHP rrdtool extension)

    服务器基本信息  CentOS 5. 7 X86_64  RRDtool 1.4.5  PHP 5.3.8 第二步 解压 php_rrdtool.tar.gz 包 移动到php 的扩展目录下我这边是( ...

最新文章

  1. 为什么要学习 Markdown?究竟有什么用?
  2. Memcache的部署和使用
  3. 《JAVA程序设计》_第四周学习总结
  4. 数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream
  5. uoj#119. 【UR #8】决战圆锥曲线(线段树+复杂度分析)
  6. php mysql怎么实现,使用php与mysql怎么实现一个无限级分类
  7. 职场实用和常用的十大心理学效应
  8. 靠打麻将赢来800万!开家烂店天天跟顾客对着干,年赚569亿!
  9. 【记录】PS立体透明字效果
  10. talentcentral测评结果_热门推荐!雅诗兰黛2021笔试攻略,最新版Talent Central笔试真题!...
  11. 【Unity游戏开发基础】如何做可以调整音量的UI滚动条组件
  12. html相册 自动,ACDSee的HTML相册生成
  13. win10+opencv+VS2015安装教程
  14. Springboot系列之RestApi中获取枚举类属性的几种方式
  15. 基于内容的图像检索系统 【多媒体系统导论大作业】
  16. css 首行缩进两字符
  17. JAVA设计模式之桥接模式
  18. IP网络摄像机安装注意事项
  19. 云服务器BCc怎么创建php环境,百度智能云服务器BCC如何升级wordpress的php环境
  20. 樊登读书赋能读后感_樊登读书会本周末视频解读新书:《赋能》突破深井,打造优质团队...

热门文章

  1. Feign、OpenFeign及SpringCloud Feign的区别
  2. VMware 16.2.3 Window 版本下载
  3. reaver 和 aircrack-ng 安装与使用
  4. consul注册中心高可用集群的搭建经验
  5. 2023互联网相关岗位转行与就业选择的简单分析
  6. 满满干货!红书运营保姆级教程
  7. 扫地机器人石头爬坡_智能扫地机器人爬坡能力分析
  8. python将字符串转换成list或dict对象的方法
  9. 微酋长,带你领略小程序大事记年史
  10. 如何安装React教程