CN101411164A - 用于远程可视合成的协议 - Google Patents
用于远程可视合成的协议 Download PDFInfo
- Publication number
- CN101411164A CN101411164A CNA2004800013345A CN200480001334A CN101411164A CN 101411164 A CN101411164 A CN 101411164A CN A2004800013345 A CNA2004800013345 A CN A2004800013345A CN 200480001334 A CN200480001334 A CN 200480001334A CN 101411164 A CN101411164 A CN 101411164A
- Authority
- CN
- China
- Prior art keywords
- resource
- bag
- synthetic
- type
- create
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/60—Scheduling or organising the servicing of application requests, e.g. requests for application data transmissions using the analysis and optimisation of the required network resources
- H04L67/61—Scheduling or organising the servicing of application requests, e.g. requests for application data transmissions using the analysis and optimisation of the required network resources taking into account QoS or priority requirements
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L12/00—Data switching networks
- H04L12/28—Data switching networks characterised by path configuration, e.g. LAN [Local Area Networks] or WAN [Wide Area Networks]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L65/00—Network arrangements, protocols or services for supporting real-time applications in data packet communication
- H04L65/40—Support for services or applications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/22—Parsing or analysis of headers
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Security & Cryptography (AREA)
- Multimedia (AREA)
- Stored Programmes (AREA)
- Information Transfer Between Computers (AREA)
- Communication Control (AREA)
- Computer And Data Communications (AREA)
- Image Generation (AREA)
- Processing Or Creating Images (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
揭示了在远程装置上创建和控制合成的方法和协议。该协议使服务器和其它装置能够利用远程装置的处理能力,来呈现远程装置上的合成,从而增加服务器的可升级性并发挥远程装置的处理能力。该协议用处理这些命令所需的信息的有效载荷,来提供高层命令包以向远程装置传送资源命令包和控制包。
Description
技术领域
本发明一般涉及电子数据处理,尤其涉及管理计算机系统中的图形和控制信息流。
背景技术
基于数字多媒体、在数字设备上观看的数字格式的视频和音频合成、以及诸如图像和动画的数字媒体在性能和产量上正在快速增长。当今制造的几乎每一台个人计算机都包括某些形式的多媒体。诸如照相机、录影机、电话、电视等数字产品的销售在稳定增长。当因特网的成长在稳定快速地继续时,多媒体在因特网领域内也变得越来越流行。这些基于计算机技术的持续发展已不仅导致性能的增强,而且还导致这种计算机设备的用户对性能有了更高的期望。本行业已经以CD ROM盘、通信调制解调器、以及更快的视频和音频卡来响应增长速度。增加的用户期望则不仅扩展到硬件能力,还扩展到数据的处理能力。
例如,在诸如多媒体和音频压缩的领域中,对数据进行处理从而使它被处理成稳定和持续的流。该数据可在诸如电视会议、游戏、数字视频盘(DVD)、专业音频、电话的领域中使用,也可在对音频、视频、或音频和视频进行数字处理的其它领域中使用。
呈现(rendering)数据几乎总是需要系统中各个模块之间的某些处理形式。例如,一视频片断可能需要在专用硬件模块中解码、在另一硬件模块中位图化视频字段、在软件模块中数字滤波音频、由另一软件模块插入副标头、由软件模块解析音频数据以跳过无声时段等等。要使流传送工作,必须将数据处理成稳定流然后呈现为音频和/或视频。然而,如果数据未进行足够快的处理,数据的表示就不流畅了。
在常规的客户机-服务器呈现中,数据在服务器上得到处理,并以离散虚拟的帧的形式向在其上呈现帧的客户机发送。即使呈现条目中没有改变,每个帧仍然都包含呈现该帧所需的全部数据和信息。例如,即使帧与相邻帧完全相同,每个动画帧仍然具有要呈现该帧的全部数据和信息。结果,数据的传送消耗了大量的可用带宽。该带宽消耗减少了服务器可支持的客户机数量。另外,不能利用客户机上的硬件来处理数据。例如,处理数据的服务器不具有使用客户机硬件的硬件特征的能力,诸如3D通信加速器。
发明内容
本发明提供了创建和控制远程装置上合成的方法和协议。该协议使服务器和其它装置能够利用远程装置的处理能力,来合成远程显示装置上的视觉内容。这使服务器能处理多个客户机,因为服务器无需处理用以真正呈现合成的功能(例如绘、画、动画等等)。这导致能够发挥更多客户机侧硬件的能力,诸如客户机的3D硬件加速管道以及客户机CPU。例如,客户机能处理动画功能,它使服务器能够向客户机发送描述动画功能的信息,而不是发送组成整个动画效果的单个静态帧。
协议提供基本的高层命令包,使应用程序能够在媒体上传送在客户机装置上创建合成的命令。这些包的有效载荷可包含用于使装置上的组件创建合成的真正命令。请求应用程序发送创建合成服务、创建呈现目标和呈现环境、创建合成节点、创建合成节点的资源、以及呈现合成的命令包。
来自请求应用程序的包是资源命令包和控制包。资源命令包被路由到客户机使的相关资源。使用控制包来控制合成状态并维护客户机上的文本字形高速缓存。通知包被发送回请求应用程序。
参照附图阅读说明性实施例的以下详述,本发明的附加特征和优点将显然。
附图说明
尽管所附权利要求书以特性陈述了本发明的特征,参照附图阅读以下详细说明书,本发明及其对象和优点可得到最佳的理解:
图1是一般示出本发明驻留其中的示例性计算机系统的框图;
图2a是示出两个代码分段之间编程接口的简化框图;
图2b是示出两个代码分段之间编程接口可选实施例的简化框图;
图3a是示出两个代码分段之间编程接口的简化框图,其中该代码分段具有分成多个离散通信的通信,示出了分解(factoring)的概念;
图3b是示出两个代码分段之间编程接口可选实施例的简化框图,其中该代码分段具有分成多个离散通信的通信,示出了分解的概念;
图4a是示出两个代码分段之间编程接口的简化框图,其中该代码分段具有略去、添加、或重新定义的某些方面,示出了重新定义的概念;
图4b是示出两个代码分段之间编程接口可选实施例的简化框图,其中该代码分段具有略去、添加、或重新定义的某些方面,示出了重新定义的概念;
图5a是示出两个代码分段之间编程接口的简化框图,其中该代码分段具有使两个代码模块的某些功能合并,从而它们之间的接口改变形式,示出了串联编码的概念;
图5b是示出两个代码分段之间编程接口可选实施例的简化框图,其中该代码分段使两个代码模块的某些功能合并,从而它们之间的接口改变形式,示出了内编码的概念;
图6a是示出两个代码分段之间编程接口的简化框图,其中通信通过间接地将该通信分成多个离散通信来完成,示出了分离的概念;
图6b是示出两个代码分段之间编程接口可选实施例的简化框图,其中通信通过间接地将该通信分成多个离散通信来完成,示出了分离的概念;
图7a是示出动态地重写代码以用其它东西替换编程接口而获取相同结果的简化框图,其中示出了重写的概念;
图7b是示出动态地重写代码以用其它东西替换编程接口而获取相同结果的可选实施例的简化框图,其中示出了重写的概念;
图8是一般示出本发明在其中操作的示例性环境的框图;
图9是一般示出本发明在其中操作的可选示例性环境的框图;
图10是示出根据本发明教导创建一合成的步骤的流程图。
具体实施方式
本发明提供服务器将合成处理的各方面卸载到客户机的能力。这导致服务器侧可升级性的增加。通信协议的高层描述性质导致比用直接模式模型发送数据的情形少得多的数据和信息被发送到客户机中用于呈现数据。
在描述本发明细节之前,将描述本发明可在其中实现的示例性装置和本发明可在其中操作的环境的纵览。参照附图,其中相似标记号指向相似元件,本发明被示为在适当计算环境中实现。尽管不是必需的,本发明将在由诸如客户机工作站或服务器的计算机执行的诸如程序模块的计算机可执行指令的一般环境中进行说明。通常,程序模块包括执行特定任务或实现具体抽象数据结构的例程、程序、对象、组件、数据结构等等。此外,本领域技术人员将理解本发明可在其它计算机系统配置中实践,包括手持式装置、多处理器系统、基于微处理器的或可编程的消费品电器、网络PC、迷你计算机、大型计算机等等。本发明还可在任务由经通信网络链接远程处理装置执行的分布式计算环境中实践。在分布式计算环境中,程序模块可被置于本地和远程存储器存储设备中。
图1示出了本发明可在其上实现的适当的计算系统环境100的示例。该计算系统环境100仅是适当计算环境的一个示例,并非旨在提出对本发明使用或功能性范围作任何限制。计算环境100也不应被解释为对示例性操作环境100中所示的任一组件或其组合有任何依赖性或任何需求。
本发明也可在很多其它通用或专用计算系统环境或配置中操作。适于本发明使用的众所周知的计算系统、环境、和/或配置的示例包括,但不限于,个人计算机、服务器计算机、手持式或膝上型装置、书写板装置、多处理器系统、基于微处理器的系统、置顶盒、可编程消费品电器、网络PC、迷你计算机、大型机、包括任一种以上系统或设备的分布式计算环境等等。
本发明可以计算机可执行指令的一般环境进行说明,诸如由计算机执行的程序模块。一般而言,程序模块包括执行具体任务或实现具体抽象数据结构的例程、程序、对象、组件、数据结构等等。本发明还可在任务由经通信网络连接的远程处理装置执行的分布式计算环境中实践。在分布式计算环境中,程序模块可置于包括存储器存储设备的本地和远程计算机存储介质中。
参照图1,实现本发明的示例性系统包括以计算机110形式的通用计算装置。计算机110的组件可包括,但不限于,处理单元120、系统存储器130以及把包括系统存储器在内的各种系统组件耦合到处理单元120的系统总线121。系统总线121可能是若干总线结构类型中的任何一种,包括存储器总线或存储器控制器、外围总线、以及使用多种总线架构的任一种的本地总线。作为示例,而非限制,这些架构包括工业标准架构(ISA)总线、微信道架构(MCA)总线、增强型ISA(EISA)总线、视频电子标准协会(VESA)局部总线和也称为Mezzanine总线的外围部件互连(PCI)总线。
计算机110通常包括各种计算机可读介质。计算机可读介质可以是能被计算机110访问的任何可用介质,并包括易失性和非易失性介质、可移动和不可移动介质。作为示例,而非限制,计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质包括以任何方法或技术实现、用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的易失性和非易失性介质、可移动和不可移动介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字化多功能光盘(DVD)或其它光学存储技术、磁盒、磁带、磁盘存储器或其它磁性存储设备、或任何其它可用于存储所需信息并可由计算机110访问的介质。通信介质通常在诸如载波或其它传输机制的已调制数据信号中体现计算机可读指令、数据结构、程序模块、或其它数据,且包括任何信息输送介质。术语“已调制数据信号”意指在信号中用对信息编码方式设置或改变其一个或多个特征的信号。作为示例,而非限制,通信介质包括诸如有线网络或直线连接的有线介质,和诸如声学、射频、红外线和其它无线介质的无线介质。以上任何介质的合成也应包括在计算机可读介质的范围中。
系统存储器130包括诸如只读存储器(ROM)131和随机存取存储器(RAM)132的易失性和/或非易失性存储器形式的计算机可读介质。包含有助于计算机110如起动时在元件间传送信息的基本例程的基本输入/输出系统(BIOS)133通常存储在ROM 131中。RAM 132通常包含可被处理单元120立即访问和/或当时正被操作的数据和/或程序模块。作为示例,而非限制,图1示出了操作系统134、应用程序135、其它程序模块136、和程序数据137。
计算机110还可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。作为示例,图1图示了读取和写入不可移动、非易失性磁性介质的硬盘驱动器141,读取和写入可移动、非易失性磁盘152的磁盘驱动器151,读取和写入可移动、非易失性光盘156,诸如CD-ROM或其它光学介质的光盘驱动器155。其它也用在示例性计算环境中的可移动/不可移动、易失性/非易失性计算机存储介质包括,但不限于,如磁带、闪存卡、数字化视频光盘、数字化录像带、固态RAM、固态ROM等等。硬盘驱动器141通常通过诸如接口140的不可移动存储器接口与系统总线121连接,而磁盘驱动器151和光盘驱动器155通常通过诸如接口150的可移动存储器接口与系统总线121连接。
如上所述并如图1所示的驱动器及其相关联的计算机存储介质为计算机110提供计算机可读指令、数据结构、程序模块、和其它数据的存储。在图1中,例如,硬盘驱动器141被示为存储操作系统144、应用程序145、其它程序模块146、和程序数据147。注意这些组件可以与操作系统134、应用程序135、其它程序模块136、和程序数据137相同或不同。在此给予操作系统144、应用程序145、其它程序模块146、和程序数据147的数字不同至少说明他们是不同的副本。用户可通过输入装置如键盘162、通常是指鼠标、跟踪球或触摸板等的定位装置161、话筒163、以及书写板或电子数字化仪164向计算机110输入命令和信息。其它输入装置(未示出)可包括游戏杆、游戏垫、卫星接收器、扫描仪等等。这些和其它输入设备常常通过与系统总线耦合的用户输入接口160与处理单元120相连,但也可通过诸如并行端口、游戏端口或通用串行总线(USB)的其它接口连接。监视器191或其它类型的显示设备也可通过诸如视频接口190的接口与系统总线121相连。监视器191还可与触摸屏面板等等集成。注意监视器和/或触摸屏面板可物理地与装有计算装置110的外壳相耦合,诸如书写板类型的个人计算机。另外,诸如计算装置110的计算机还可包括诸如扬声器197和打印机196的其它输出设备,它们通过输出外围接口194等等相连。
计算机110可以在使用与一台或多台远程计算机,诸如远程计算机180的逻辑连接的网络化环境中运行。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等装置或其它公共网络节点,而且通常包括上述与个人计算机110相关的许多或全部组件,尽管在图1中仅图示了存储器存储设备181。图1中所描绘的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可包括其它网络。这样的网络化环境在办公室、企业范围计算机网络、企业内部互联网和因特网上是常见的。例如,计算机系统110可包括数据源自的源机器,而远程计算机180则可包括目标机器。
当用于LAN网络化环境中时,计算机110通过网络接口或适配器170与局域网171连接。当用于WAN网络化环境中时,计算机110通常包括调制解调器172或其它用于在广域网173,诸如因特网中建立通信的装置。可以是内置式或外置式的调制解调器172与系统总线121通过用户输入接口160或其它适当机制连接。在网络化环境中,与计算机110相关的程序模块或其一部分可存储在远程存储器存储装置中。作为示例,而非限制,图1示出了驻留于远程计算机180中的远程应用程序185。应当理解,所示网络连接是示例性的,且其它用于在计算机间建立通信连接的技术也可以使用。
应注意,编程接口(或更简称为接口)可被视为使一个或多个代码分段能与一个或多个其它代码分段通信,或能访问其所提供的功能性的任意机制、进程、和协议。或者,编程接口可被视为一系统组件的能够与其它组件的一个或多个机制、方法、函数调用、模块等通信耦合的一个或多个机制、方法、函数调用、模块、对象等。前面句子中的术语“代码分段”旨在包括一个或多个指令或代码行,并包括例如代码模块、对象、子程序、函数等等,无论所应用的是何种术语,或者是否单独编译代码分段,或者代码分段是否被提供为源、中间体、或对象代码,或者是否在运行时系统或进程中利用代码分段,或者它们是否位于同一机器或不同机器或分布在多个机器上,或者代码分段所表示的功能是否整个地在软件中、硬件中、还是硬件和软件的合成中实现。
在概念上,编程接口一般可如图2a或2b所示。图2a示出接口1为第一代码分段和第二代码分段通信的通道。图2b示出包括接口对象I1和I2的一接口,使得系统的第一和第二代码分段能通过媒体M通信。在图2b的视图中,可将接口对象I1和I2视为同一系统的独立接口,也可视为对象I1和I2加上媒体M组成了接口。尽管图2a和2b示出了双向流和流每一侧上的接口,某些实现可仅具有单向的信息流(或如以下所述的无信息流),或者可仅在一侧具有接口对象。作为示例,而非限制,诸如应用程序编程接口(API)、进入点、方法、函数、子程序、远程过程调用、以及组件对象模型(COM)接口的术语,都被包括在编程接口的定义中。
这种编程接口的各个方面可包括:第一代码分段向第二代码分段传送信息(其中在最广泛意义上使用“信息”,并包括数据、命令、请求等)的方法;第二代码分段接收信息的方法;以及信息的结构、序列、语法、组织、模式、信息的定时、和内容。这样,不管媒体是有线、无线、或两者合成,只要信息以接口定义的方式传输,基层的传输媒体本身对接口的操作就不重要了。在某些情况中,信息不在常规意义上的一个方向或两个方向上传递,因为当一代码分段仅访问由第二代码分段执行的功能时,信息传递可通过另一机制(例如信息置于与代码分段之间与信息流分开的缓存器、文件等)进行或者不存在。任意或所有这些方面在给定情况中可能是重要的,例如,取决于代码分段是否是松散耦合或紧密耦合配置中系统的一部分,因此该列表应被视为是说明性且非限制的。
该编程接口的概念对本领域技术人员是众所周知的,且在本发明以上详细描述中显然。然而,可有实现编程接口的其它方法,并且除非被确切排除,它们也将被包括在本说明书结束处陈述的权利要求书中。这些其它方法会显得比图2a和2b的简化视图更深奥或更复杂,但即便如此它们仍执行完成相同总体结果的相似功能。我们将简要描述编程接口的部分说明性任选实施例。
A.分解
通过将通信分成多个离散通信可间接地完成从一个代码分段到另一代码分段的通信。这在图3a和3b中进行示意描述。如图所示,可根据可划分功能组来描述某些接口。因而,可分解图2a和2b的接口功能以获取同样的结果,正如数学上可提供24,或者为2x2x3x2。相应地,如图3a所示,可划分由接口1提供的功能以将该接口的通信转换成多个接口:接口1A、接口1B、接口1C等而获取同样的结果。如图3b所示,可再次将接口I1提供的功能划分成多个接口:I1a、I1b、I1c等而获取同样的结果。类似地,从第一代码分段接收信息的第二代码分段的接口I2也可被分解成多个接口:I2a、I2b、I2c等。在分解时,包括在第一代码分段中的接口数量不需要匹配包括在第二代码分段中的接口数量。在图3a和3b的任一情形中,接口1和I1的功能实质分别与图2a和2b的一样。接口的分解也可遵从结合、交换、以及其它数学属性使得分解难以识别。例如,操作的顺序在某些应用中并不重要,且因而由接口实现的功能可在到达接口之前由另一代码或接口很好地实现,或者由系统的独立组件执行。此外,编程领域技术人员可理解,有各种各样获取同样结果而作不同函数调用的方法。
B.重新定义
在某些情形中,略去、添加、或重新定义编程接口的某些方面(例如参数)而仍完成所要结果是可能的。这如图4a和4b所示。例如,假设图2a的接口1包括一函数调用Square(input,precision,output),它包括三个参数input(输入),precision(精度)和output(输出),并从第一代码分段发往第二代码分段。如果中间参数precision在给定情形中无关紧要,如图4a所示,则可略去它甚至用meaningless(无意义)参数替换它(在此情形中)。也可添加不重要的additional(附加)参数。在任一情形中,只要在输入由第二代码分段进行square(平方)之后返回输出,就可获得square的功能。对计算机系统某些下游部分或其它部分precision可以是非常好的有意义的参数;然而,一旦认为precision对于计算square的有限目的而言是不必要的,则替换或略去它。例如,替代传送有效的precision值,可传送诸如生日的无意义值而不会不利地影响结果。类似地,如图4b所示,由接口I1’替换接口I1,它进行了对接口略去或添加参数的重新定义。接口I2可类似地被替换为接口I2’,它进行了略去不必要参数或在其它地方进行处理的参数的重新定义。此处的要点是,在某些情形中,编程接口可包括某些目的所不需要的一些方面,诸如参数,因此可略去或重新定义它们,或者在其它地方进行处理用于其它目的。
C.串联编码
合并两个独立代码模块的部分或所有功能从而使它们之间的“接口”改变形式也是可行的。例如,可将图2a和2b的功能分别转换成图5a和5b的功能。在图5a中,先前图2a的第一代码分段和第二代码分段被合并成一包含它们的模块。在此情形中,代码分段仍然可互相通信,但接口则被调整为更适于单个模块的形式。因而,例如,正式的调用和返回语句不再必要,但是依照接口1的类似处理或响应仍然有效。类似地,如图5b所示,图2b的接口I2的一部分可被写入I1内以形成接口I1’。如图所示,接口I2被划分成I2a和I2b,而接口部分I2a被编码在接口I1内以形成接口I1’。作为具体示例,考虑图2b的接口I1执行函数调用square(input,output),它在由第二代码分段处理用input传送的值(以平方之)之后由接口I2接收,并用output传送回平方后的值。在此情形中,由第二代码分段(平方input)执行的处理无需调用接口就可由第一代码分段执行。
D.分离
通过将通信分成多个离散通信可间接地完成从一个代码分段到另一代码分段的通信。这在图6a和6b中进行示意描述。如图6a所示,提供一个或多个中间件(分离接口,因为它们从原始接口中分离功能和/或接口功能)以转换第一接口接口1上的通信以使它们遵从一不同接口(在此情形中为接口2A、接口2B和接口2C)。可这样完成:例如,有已安装的应用程序基础根据接口1协议被设计为与操作系统通信,但是随后操作系统被更改成使用一不同接口(在此情形中为接口2A、接口2B和接口2C)。要点是,由第二代码分段使用的原始接口被更改,从而它不再与第一代码分段使用的接口兼容,且因而使用一中间体使得新旧接口兼容。类似地,如图6b所示,可将分离接口DI1引入第三代码分段以接收来自接口I1的通信,并引入分离接口DI2以将接口功能传送给例如经重新设计与DI2一起工作的接口I2a和I2b,而仍提供同样的功能结果。类似地,DI1和DI2可一起工作以将图2b接口I1和I2的功能翻译成一新操作系统,而仍提供同样的或相似的功能结果。
E.重写
另一可能变体是动态地重写代码以用其它东西替换接口功能而仍提供同样的总体结果。例如,可有一系统,其中以中间语言(例如微软IL、JavaByteCode等)呈现的代码分段被提供给执行环境中的运行时(JIT)编译器或解释器(诸如由.Net框架、Java运行时环境、或其它类似运行时类型环境所提供的)。可编写JIT编译器以动态转换从第一代码分段到第二代码分段的通信,即让它们遵从第二代码分段(原始或不同的第二代码分段)所需的一不同接口。这在图7a和7b中描述。如图7a所示,该方法类似于上述分离情形。可这样完成:例如,其中已安装的应用程序基础根据接口1协议被设计为与操作系统通信,但是随后操作系统被更改成使用一不同接口。可使用JIT编译器以遵从已安装了基础的应用程序到操作系统新接口在运行中的通信。如图7b所示,动态地重写接口的方法可被应用于动态分解,或用其它方法改变接口。
还要注意,用于通过任选实施例获取与接口相同或相似结果的上述情形也可以各种方法合成,串行地和/或并行地,或者用其它介入代码。因而,以上呈现的任选实施例并非互相排斥,而是可以加以混合、匹配和合成以产生与图2a和2b所示一般情形相同或等效的情形。还要注意,由于使用大多数编程结构,有许多未在此描述的可获取接口相同或相似功能的其它类似方法,但虽然如此仍可由本发明的精神和范围来表示,即,要注意,在接口值之下的接口至少代表部分功能,并使能有利结果。
在以下描述中,本发明将参照一个或多个计算机所执行的操作的和动作符号表示来描述,除非另有指明。这样,可以理解,这种经常被称为是计算机可执行的动作和操作,包括由以结构化形式表示数据的电子信号计算机的处理单元进行的操纵。这种操纵转换数据或将其保持在计算机存储器系统的单元中,这可用本领域技术人员众所周知的方式来重新配置或以其它方式改变计算机的操作。保持数据的数据结构是具有由数据格式定义的特定属性的存储器物理单元。然而,尽管本发明在前述环境中进行描述,但这并非旨在作出限制,因为本领域技术人员将理解此后所述的各种动作和操作也可在硬件中实现。
现在参照图8,示出了本发明在其中操作的示例性环境200。应用程序202、204驻留在服务器206上。窗口管理器208使人操作、组织窗口,并执行诸如移动窗口、调整窗口尺寸、去除窗口、用标题栏或其它使以上操作简易化的条目装饰窗口等的操作。应用程序202、204创建了可视树以指示应用程序如何显示一条目(例如文本文档、图形、动画等)。可视树表示由图形系统呈现给媒体(例如显示器、打印机、平面等)的一数据结构。当呈现可视树时,可视树中的数据是在使用应用程序时用户在显示屏的应用程序区域看到的“情景”。应用程序202、204保留对它们相应视觉树的控制,以控制在显示装置(例如监视器191)上发生在应用程序显示区域的事件。应用程序202、204通过接口228向进行中合成循环呈现其可视树输出。该输出被用以建立应用程序可视树的子树。该子树被合成为一平面,而该平面被呈现给窗口管理器208用于桌面合成。然后窗口管理器208基于显示屏上应用程序的可视性来评估将要显示的和不会显示的,而基于该评估创建了一组合成树214、216。合成树独立于可视树而被呈现。合成树包括从可视树编译的用户将在显示装置上见到的所有元素。例如,如果创建了文档的可视树,合成树将是要显示的那部分文档。
本发明允许远程创建和操作合成树,而无需在服务器上创建合成树。尽管本发明根据远程创建和操作合成树来描述,可以理解可使用本发明在图8服务器上创建并呈现各合成。现在参照图9,服务器206上的应用程序202、204在客户机装置220上显示。尽管仅示出了一客户机装置,可以理解可使用任何数量的客户机装置。通过使用包的信道232,应用程序202、204和窗口管理器208使用接口228经网络230分别与合成模块222-226通信。可连同单个应用程序领域使用的合成模块数量按需可为任意数量。注意服务器206和客户机220无需通过网络或任意其它方式连接,相反,数据可通过能由服务器平台写入而由客户机平台读取的任何媒体来传送。在一实施例中,包用远程数据协议来封装,以向客户机220发送创建合成树214、216的信息。每个包中置入标识符以标识哪个合成模块222-226是该包的目标。组件234将包多路分离,并将包发送给模块222-226的适当的变化队列240、242、244。
本发明的装置无关协议向应用程序和客户机提供通过信道232与服务器的接口以合成内容。内容的类型包括资源命令包和控制包。资源类型包括笔、画刷、位图、字形、视频片断、几何图形(椭圆、长方形、方框、圆等)、动画、存储等。合成节点是客户机应用程序可用的空间容量的基本单元。客户机创建其合成服务上的合成节点。一合成节点可包含一个或多个资源。总是有一个表示屏幕内容或桌面的根合成节点。有一个或多个表示屏幕以外合成的合成节点。
在以下描述中,将通过典型的调用序列来描述装置无关协议。通信是异步的。使用了特定的连接、重新连接、以及断开语义。应用程序202、204、208分别与存在于客户机220上的合成模块222、224通信。通常单个连接会起动并在应用程序的使用寿命期间保持,因为连接和断开连接是昂贵的操作,且与客户机上合成模块的通信可能比较频繁。保持连接的成本比重复断开和连接的成本低得多。服务器应用程序202、204、208和合成模块222-226之间的通信是以包形式进行的。
服务器应用程序202、204、208与客户机220连接,并开始发送包。包可以是资源包、控制包、以及批处理包。使用资源包来创建资源和更新资源。使用控制包来控制合成状态并在客户机220上维护一文本字形位图缓存器。使用批处理包来原子化地应用多个更改。一创建批命令被发送给客户机220以指示一批处理的开始。合成模块积累请求直至批处理被“终止”。通过发送批处理结束/呈现包结束该批处理。此时,合成服务开始处理命令。合成服务中的变化队列保持批处理化结构以便确保各变化原子化地发生。
现在参照图10,示出了创建和控制合成的步骤。将使用服务器应用程序202来描述这些步骤。本领域技术人员理解可使用任意代码分段。创建一合成模块(步骤300)。合成模块负责呈现已创建的连接的合成。创建产生一资源命令的一呈现目标,该资源命令创建一呈现目标资源(步骤302),并且创建与呈现目标资源相关联的呈现环境(步骤304)。呈现目标是用于呈现资源的目的地目标。创建一合成节点(步骤306)。然后创建资源(步骤308)并呈现合成(步骤310)。
合成利用了简单和复合资源的组合以便向目标呈现内容。简单资源是自包含的,且对任何其它资源没有直接的依赖。复合资源指其它依赖性资源。复合资源的一个示例是“描绘数据”资源。“描绘数据”资源由可随后引用诸如画刷、笔、或几何图形描述的其它资源的描绘指令的保留列表组成。使用描绘数据资源来编码在其它资源帮助下执行的描绘操作。描绘数据资源与合成节点相关联,它们具有在空间上本地化这些描绘操作的任务。
当需要更新一合成时,发送一更新命令(步骤312)。更新可添加资源或更新资源。可能需要删除特定的合成并创建新的合成。例如,如果合成是文本文档,如果关闭文本文档则删除该合成。如果要删除该合成,向合成服务发送一解除命令(步骤314)。
动画在平台上是渗透性的。通过使客户机能采取估算和展现动画的全部责任,本发明在一实施例中提供了可缩放的动画。这在许多情形中是满足需要的,特别是在动画较复杂或动画目标需要未经加速的一组操作(诸如镶嵌式铺装)发生时。对于某些低成本、高可视性的用户接口效果,诸如动漫,允许这些操作在一链合成过程中发生是有意义的。在此情形中,应用程序202将采样高层动画函数,并向合成服务提供一系列与资源相关联的经时间标记的值作为请求。这些表示资源要进行动画的间隔,以及该间隔保持活动的时间线的两个端点。应用程序202发送更新资源包以更新一资源值。注意该序列掩饰了基层的复杂性。合成模块将经时间标记的值标准化为合成服务的全局时间线,而合成管理器(未示出)在合成到呈现目标期间将更新块插入适当资源。对于每个已合成帧,合成模块将估算资源的间隔以导出瞬时值。
既然已描述了编程接口的总体结构,将描述资源和控制命令包。使用控制包来控制合成状态并维护由客户机220上合成模块使用的字形缓存器。
控制包是Resource_Command_Null、Resource_Command_Release、Resource_Command_Shutdown、Resource_Command_Synchronize、Resource_Command_Status、Resource_Command_Add_Glyph_Bitmaps、Resource_Command Free_Glyph_Bitmaps、以及Resource_Command_Flush_Queue。Resource_Command_Release释放了一资源。Resource_Command_Shutdown关闭了合成模块并删除了与该合成模块相关联的一切。Resource_Command_Synchronize删除与该合成模块相关联的一切以开始刷新。Resource_Command_Status向合成模块发送一状态消息。Resource_Command_Add_Glyph_Bitmaps向字形缓存器添加位图。Resource_Command_Free_Glyph_Bitmaps从字形缓冲器移除位图。Resource_Command_Flush_Queue排空变化队列。
维持一从客户机220向服务器206传回通知包的通知队列。它们可以是以下类型:Notification_Resource_Deleted、Notification_Shutdown、Notification_Synchronize、Notification_Status、以及Notification_Error。
使用资源命令包来呈现资源。资源可被定义为“用于呈现要求不同分辨率和/或物理装置的不同实现的一情景的所需要的任一对象;在一合成树上使用多次的;或者可独立于其用户通过动画而变化的”。资源能够串行化本身、应用更新、并提供特定分辨率和装置的实现。资源类型包括空、存储、描绘数据、位图、字形、顶点、时间线、双重动画、色彩动画、点动画、长方形动画、尺寸动画、双重动画集、色彩动画集、点动画集、长方形动画集、尺寸动画集、变换、双重、色彩、点、长方形、尺寸、梯度、画刷、图、几何图形、笔、视频、Composition_Node、Composition_Context、图像、Hwnd_Composition_Target、以及Intermediate_Composition_Target。使用Hwnd_Composition_Target来向窗口呈现。使用Intermediate_Composition_Target用于屏幕以外的呈现。
通常无需回调,发送给合成模块的资源就可以由合成模块直接实现。如果不可直接实现,发送所需实现。要实现类似“文本”和“图像”的资源是昂贵的(根据处理开销)并因此转换成在合成树上使用的适当“准备呈现”形式。将资源转换成准备呈现形式节约了在合成模块中合成的开销。如果需要任何对用户代码的回调,资源也可被转换成适当的“准备呈现”形式。可由合成模块有效地镶嵌式铺装成正确分辨率的其它类似“几何图形”资源在需要时由合成模块本身实现。
通常资源被分成一些类型,诸如绘图资源、值资源、以及结构资源。绘图资源是由描绘层定义的对象,且可直接由该层使用。绘图资源的示例包括描绘数据、位图、图像、字形、几何图形、以及画刷。
具有很低并给定描绘成本的绘图资源可在直接来自与装置和分辨率无关的资源数据的合成期间得以实现。几何图形是简单的绘图资源,因为它在合成模块的合成循环中可有效地镶嵌式铺装成所需的最终分辨率。相反,复杂的绘图资源需要复杂的计算、对用户代码的回调、或者输入/输出以产生实现。在一实施例中,复杂的绘图资源不由合成模块实现。相反,适当的实现由应用程序202、204和/或服务器206在合成之前提供。“图像”是复杂资源的一个示例。图像从盘上读取、解码、以适当分辨率采样、并进行过滤。
值资源表示由另一资源使用的简单的可变或动态值。值资源的示例是双重、点、色彩、以及变换。例如,描绘数据资源可指要画线的点资源,其中点之一期望通过动画或应用程序的强制指向而变化。如果值资源可变动,则值资源包含定义该值如何随时间变化的动画间隔数据。
结构资源是在合成过程中起作用的对象,但并非直接是呈现的一部分。这些对象被实现为资源,从而它们可通过变化队列参与更新,并使用值资源来更新间隔值。经标识的结构资源包括合成节点。
一般而言,必须在被使用之前实现资源。实现可被称为“适于给定分辨率的并准备由特定装置使用的资源表示”。实现的一个示例是经镶嵌式铺装成三角形的具有特定分辨率和变形的几何图形,并可能已载入到视频卡上的顶端缓存。实现在合成模块中按需创建,或者在服务器206上创建并传送给合成模块。如果所需资源实现未发现或创建,则通过通知队列将通知在服务器206上排队。该通知指示资源句柄、变换、以及所需装置、以及所使用实现的任何变形。
包具有如下所示的结构:
{
MIL_PACKET_TYPE packetType;
HMIL_RESOURCE resHandle;
MIL_RESOURCE_TYPE type;
DWORD size;
int marshalType;
}
其中Mil_Packet_Type是批处理包、控制包、或者资源包之一。HMIL_Resource句柄必须具有资源的适当类型。这些句柄标记必须用于资源、环境、或合成节点(例如compnode)。Mil_Resource_Type是如上所述的资源类型(例如位图、变形、几何图形等)。
附加于包的是用以指令合成服务执行任务的命令。这使得第三方供应商提供自己的代码以操作其合成服务。一种这样的实现如下。
//HRESULT CMilResourceBrushSolidColorData::MarshalDataCore
struct BrushSolidColorPacket
{
MIL_COLORF colr;
HMIL_RESOURCE hColor;
}
/*
HRESULT
CMilResourceBrushSolidColorData::MarshalDataCore(IMilTranspor
pEncoder)
{
HRESULT hr =S_OK;
Assert(NULL!=pEncoder);
//Call base method before our own
CMilResourceBrushData::MarshalDataCore(pEncoder);
pEncoder->AddColor(&(m_brushSolidData.color));
pEncoder->AddResource(m_brushSolidData.hColor);
Cleanup:
RRETURN(hr);
}
*/
//HRESULT CMilResourceBrushLinearGradient::Marshal
struct BrushLinearGradientPacket:Packet
{
int brushtype=MilUceBrushTypeLinearGradient;
float Alpha;
HMIL_RESOURCE hAlpha;
HMIL_RESOURCE hTransform;
float beginPointx;
float beginPointy;
HMIL_RESOURCE hBeginPoint;
float endPointx;
float endPointy;
HMIL_RESOURCE hEndPoint;
int wrapMode;
HMIL_RESOURCE hGradient;
int bGammaCorrect;
int bAdjustToObject;
}
//CMilResourceBrushData::MarshalData
struct BrushDataPacket:Packet
{
int brushtype;
double dblOpacity;
HMIL_RESOURCE hOpacity;
HMIL_RESOURCE hTransform;
}
//CMilResourceBrushRadialGradient::Marshal
struct BrushRadialGradientMarshalPacket:Packet
{
UINT brushtype=MilUceBrushTypeRadialGradient;
float alpha;
HMIL_RESOURCE hAlpha;
HMIL_RESOURCE hTransform;
float centerPointX;
float centerPointY;
HMIL_RESOURCE hCenter;
float radPointX;
float radPointY;
HMIL_RESOURCE hRadius;
float focPointX;
float focPointY;
HMIL_RESOURCE hFocus;
int wrapMode;
HMIL_RESOURCE hGradient;
int bGammaCorrect;
int bAdjustToObject;
}
//CMilResourceGradient::Marshal
struct GradientMarshalPacket:Packet
{
UINT stopCount;
//stops bytes here:
//hr=pEncoder->AddMemory(m_data.m_rgGradientStops,nDataByteCount);
}
//CMilResourceBrushNineGrid::Marshal
struct BrushNineGridMarshalPacket:Packet
{
int brushType=MilUceBrushTypeNineGrid;
double rOpacity;
HMIL_RESOURCE hOpacity;
HMIL_RESOURCE hTransform;
HMIL_RESOURCE hImageData;
HMIL_RESOURCE hGlyphImageData;
UINT iLeftBorder;
UINT iTopBorder;
UINT iRightBorder;
UINT iBottomBorder;
}
//TMilMasterAnimatedValue<TValue,ResType,AnimResType,
CollResType>::Marshal(
struct MasterAnimatedValuePacket:Packet
{
int animtype=MilAnimatedValueMarshal;
int marshalType=MilAnimatedValueMarshalAux;
HMIL_RESOURCE hAnimationCollection;
int offsetToValue;
int sizeOfValue=sizeof(TValue);
int offsetToBaseValue;
int sizeOfBaseValue=sizeof(TValue);
}
struct MasterAnimationCollectionPacket:Packet
{
int cAnimations;
HMIL_RESOURCE handleArray;
//for(nAnimation=0;nAnimation<m_cAnimations;
nAnimation++)
//{
//pEncoder-
>AddResource(m_rghAnimations[nAnimation]);
//}
}
struct MasterAnimationPacket:Packet
{
int animtype=MilAnimationCopy;
HMIL_RESOURCE hTimeline;
//m_animationData.WriteData(pEncoder);
}
//TMilMasterValue<TValue,ResType>::SendUpdatePacket(
struct MasterValueUpdatePacket|Packet
{
int valueType=MilValueMarshal;
int auxType=MilValueMarshalAux;
int size;//sizeof(TValue)
//resrve memory for value copy.
}
struct TMilAnimationDataPacket:Packet
{
int animationType;
int interpolationMethod;
BYTE fIsAdditive;
BYTE fIsAccumulating;
UINT cValues;
//next space values and key times.
//pEncoder->AddMemory(m_rgValues,sizeof(TValue)*m_cValues);
//pEncoder->AddMemory(m_rgKeyTimes,sizeof(double)*m_cValues);
BYTE fHasKeySplinePoints;
//Next:space for spline points.
//if(m_rgKeySplinePoints)
//{
//pEncoder->AddByte((BYTE)TRUE);
//pEncoder->AddMemory(
//m_rgKeySplinePoints,
//sizeof(MIL_2DPOINTD)*2*(m_cValues-1));
//}
//else
//{
//pEncoder->AddByte((BYTE)FALSE);
//}
}
struct BitmapUpdatePixelsPacket:Packet
{
int bitmaptype=MilBitmapUpdatePixels;
int prectX;
int prectY;
int prectWidth;
int prectHeight;
UINT stride;
UINT cbSize;
//pixels after this
}
struct BitmapAddDirtyRectPacket:Packet
{
UINT bitmaptype=MilBitmapAddDirtyRect));
UINT prectX;
UINT prectY;
UINT prectWidth;
UINT prectHeight;
}
struct BitmapMarshalPixelsPacket:Packet
{
UINT bitmaptype=MilBitmapCopy;
int prectX;
int prectY;
int prectWidth;
int prectHeight;
UINT stride;
UINT format;
UINT cbSize;
//pixels after this
}
struct RenderDataMarshalPacket:Packet
{
int renderdatatype=MilRenderDataCopy;
UINT nHandleCount;
UINT nByteCount;
//handles and data follow.
}
//CMasterCompositionContext::SetRoot
struct CompositionContextSetRootPacket:Packet
{
UINT commandType=CONTEXT_SETROOT;
HMIL_COMPNODE hRoot;
}
//CMasterCompositionNode::SetProperty
struct CompositionNodeSetPropertyPacket:Packet
{
UINT commandType=CCompositionCommand::NODE_SETPROPERTY;
HMIL_RESOURCE hResource;
//command memmory here.
}
//CMasterCompositionNode::InsertChildAt
struct CompositionNodeInsertChildAtPacket:Packet
{
UINT commandType=CCompositionCommand::NODE_INSERTCHILD;
HMIL_COMPNODE hChild;
UINT iPosition;
}
//CMasterCompositionNode::RemoveChild
struct CompositionNodeRemoveChildPacket:Packet
{
UINT commandType =CCompositionCommand::NODE_REMOVECHILD;
HMIL_COMPNODE hChild;
}
//CMasterCompositionNode::Marshal
struct CompositionNodeMarshalPacket:Packet
{
UINT commandType=CCompositionCommand::NODE_CREATE;
HMIL_RESOURCE hTransform;
HMIL_RESOURCE hClip));
HMIL_RESOURCE hRenderData;
HMIL_RESOURCE bAlpha;
UINT childCount;
//handles here
}
//CMilResourceGeometry::MarshalEmpty
struct GeometryMarshalEmptyPacket:Packet
{
UINT geomType;
}
//CMilResourceGeometry::MarshalLine
struct GeometryMarshalLinePacket:Packet
{
int pGeomType;
HMIL_RESOURCE hTransformRes;
double PointlX;
double PointlY;
HMIL_RESOURCE hPointlRes;
double Point2X;
double Point2Y;
HMIL_RESOURCE hPoint2Res;
}
//CMilResourceGeometry::MarshalRectangle
struct GeometryMarshalRectangle:Packet
{
int pGeomType;
HMIL_RESOURCE hTransformRes;
double RectX;
double RectY;
double RectWidth;
double RectHeight;
HMIL_RESOURCE hRectRes;
double RadiusX;
HMIL_RESOURCE hRadiusXRes;
double RadiusY;
double RadiusYRes;
}
//CMilResourceGeometry::MarshalEllipse
struct GeometryMarshalEllipse:Packet
{
int pGeomType;
HMIL_RESOURCE hTransformRes;
double CenterX;
double CenterY;
HMIL_RESOURCE hCenterRes;
double RadiusX;
HMIL_RESOURCE hRadiusXRes;
double RadiusY;
HMIL_RESOURCE hRadiusYRes;
}
//CMilResourceGeometry::MarshalPath
struct GeometryMarshalPath:Packet
{
int pGeomType;
HMIL_RESOURCE hTransformRes;
int FillMode;
int Count;
int Size;
//path data appended here.
//pEncoder->AddMemory(pGeom->FigureData,pGeom->Size);
}
//HRESULT CMilResourceGeometry::MarshalCollection
struct GeometryMarshalCollectionPacket:Packet
{
int pGeomType;
HMIL_RESOURCE hTransformRes;
int CombineMode;
int count;
//handles here:
//for(UINT i=0;i<pGeom->Count;i++)
//{
//pEncoder->AddResource(pGeom->Resources[i]);
///}
}
//HRESULT CGlyphCacheMasterManager::UpdateResource(bool fAddBitmaps)
struct UpdateGlyphCachePacket:Packet
{
MIL_UPDATE_GLYPHCACHE us;
ARRAY_RECORD glyphIndeces;//UINT array of indeces.Allocated with
AddArray
ARRAY_RECORD glyphBitmaps[];//number of entries is nr of
glyphIndeces
ARRAY_RECORD normAdvancedWidth;//number of entries is nr of
glyphIndeces
ARRAY_RECORD fontFileName;
}
//HRESULT CMilMasterGlyphRun::DoMarshal
struct GlyphRunMarshalPacket:Packet
{
GLYPHRUN_MARSHAL_TYPE glyphRunType;
MIL_CREATE_GLYPHRUN createStruct;
USHORT GlyphIndeces[];
DOUBLE AdvanceWidths[];
WCHAR UnicodeString[];
MIL_2DPOINTF GlyphOffsets[];
USHORT CharacterToGlyphMap[];
WCHAR FontFileName[];
}
//HRESULT CMilMasterGlyphRun::MarshalRealization
struct GlyphRunRealizationPacket|Packet
{
GLYPHRUN_MARSHAL_TYPE glyphRunType;
DOUBLE scaleX;
DOUBLE scaleY;
}
//HRESULT CMilMasterGlyphRun::MarshalGeometryHandle
struct GlyphRunMarshalGeometryHandlePacket:Packet
{
GLYPHRUN_MARSHAL_TYPE glyphRunType;
HMIL_RESOURCE hGeometry;
}
//CMilResourcePen::SetWidth
struct PenSetWidthPacket:Packet
{
int penCommand=CMilPenData::MilPenSetWidth;
double width;
}
//CMilResourcePen::Marshal
struct PenMarshalPacket:Packet
{
int penCommand =CMilPenData::MilPenCopy;
HMIL_RESOURCE hBrushRes;
HMIL_RESOURCE hWidthRes;
double width;
double miterLimit;
BYTE startCap;
BYTE endCap;
BYTE dashCap;
BYTE joinCap;
}
//CMasterHWndRenderTarget::Marshal
struct HWndRenderTargetMarshalPacket:Packet
{
int targetCommand=CCompositionCommand::HWNDRT_CREATE;
HWND m_hWnd;
HMIL_CONTEXT m_hCompositionContext;
UINT uiWidth;
UINT uiHeight;
UINT dwRTInitializationFlags;
}
//CMasterHWndRenderTarget::SetCompositionContext
struct HWndRenderTargetSetCompositionContextPacket:Packet
{
int targetCommand=CCompositionCommand::HWNDRT_SETCONTEXT;
HMIL_CONTEXT hCompositionContext;
}
//CMasterHWndRenderTarget::Resize
struct HWndRenderTargetResizePacket:Packet
{
int targetCommand=CCompositionCommand::HWNDRT_RESIZE;
UINT uiWidth;
UINT uiHeight;
}
//CMasterHWndRenderTarget::Invalidate
struct HWndRenderTargetInvalidatePacket:Packet
{
int targetCommand =CCompositionCommand::HWNDRT_INVALIDATE;
RECT rect;
}
//CMasterHWndRenderTarget::SetRenderingMode
struct HWndRenderTargetSetRenderingModePacket
{
int targetCommand=CCompositionCommand::HWNDRT_SETRENDERINGMODE;
UINT dwRTInitializationFlags;
}
//CMasterGenericRenderTarget::Marshal
struct GenericRenderTargetMarshalPacket:Packet
{
int targetCommand=CCompositionCommand::HWNDRT_CREATE;
UINT uiWidth;
UINT uiHeight;
UINT dwRTInitializationFlags;
//memory copied info here
//pEncoder->AddMemory(&m_Info,sizeof(m_Info));
}
//CMasterGenericRenderTarget::SetCompositionContext(
struct GenericRenderTargetSetCompositionContextPacket:Packet
{
int targetCommand=CCompositionCommand::HWNDRT_SETCONTEXT;
HMIL_CONTEXT hCompositionContext;
}
//CMilMasterTimeline::Marshal
struct TimelineMarshalPacket:Packet
{
int type=MilTimelineMarshal;
BYTE fIsEnabled;
HMIL_RESOURCE hParentTimeline;
UINT intervalCount;
//copy memory here.
//pEncoder->AddMemory(&ct,sizeof(MIL_CREATE_TIMELINE));
}
//CMilMasterTimeline::SendAddIntervalPacket
struct TimelineAddIntervalPacket:Packet
{
int type=MilTimelineAddInterval;
//copy interval memory here
//pEncoder->AddMemory(pti,sizeof(MIL_TIME_INTERVAL);
}
//CMilMasterTimeline::SendClearPacket
struct TimelineSendClearPacket:Packet
{
int type=MilTimelineClear;
}
//CMilMasterTimeline::SendEnablePacket
struct TimelineSendEnablePacket:Packet
{
int type=MilTimelineEnable;
HMIL_RESOURCE hParentTimeLine;
}
//CMilMasterTimeline::SendDisablePacket
struct TimelineSendDisablePacket:Packet
{
int type=MilTimelineDisable;
}
//HRESULT CMilResourceTransform::MarshalIdentity
struct TransformMarshalIdentityPacket:Packet
{
int transType=MilTransformIdentity;
}
//HRESULT CMilResourceTransform::MarshalMatrix3x2
struct TransformMarshalMatrix3x2Packet:Packet
{
int transType=MilTransformMatrix3x2;
double S_11;
double S_12;
double S_21;
double S_22;
double DX;
double DY;
}
//HRESULT CMilResourceTransform::MarshalMatrix4x4
struct TransformMarshalMatrix4x4Packet:Packet
{
int transType=MilTransformMatrix4x4;
float coef[16];
}
//HRESULT CMilResourceTransform::MarshalTranslate
struct TransformMarshalTranslatePacket:Packet
{
int transType=MilTransformTranslate;
double OffsetX;
HMIL_RESOURCE OffsetXRes;
double OffsetY;
HMIL_RESOURCE OffsetYRes;
}
//HRESULT CMilResourceTransform::MarshalScale
struct TransformMarshalScalePacket:Packet
{
int transType=MilTransformScale;
double ScaleX;
HMIL_RESOURCE hScaleXRes;
double ScaleY;
HMIL_RESOURCE hScaleYRes);
double CenterX;
double CenterY;
HMIL_RESOURCE hCenterRes;
}
//HRESULT CMilResourceTransform::MarshalRotate
struct TransformMarshalRotatePacket:Packet
{
int transType=MilTransformRotate;
double Angle;
HMIL_RESOURCE hAngleRes;
double CenterX;
double CenterY;
HMIL_RESOURCE hCenterRes;
}
//HRESULT CMilResourceTransform::MarshalSkew
struct TransformMarshalSkewPacket:Packet
{
int transType=MilTransformSkew;
double AngleX;
HMIL_RESOURCE hAngleXRes;
doble AngleY;
HMIL_RESOURCE hAngleYRes;
double CenterX;
double CenterY;
HMIL_RESOURCE hCenterRes;
}
struct TransformMarshalCollection:Packet
{
int transType=MilTransformCollection;
int Count;
//reserve memory for collection handles
//for(UINT i=0;i<pTrans->Count;i++)
//{
//pEncoder->AddResource(pTrans->Resources[i]);
//}
}
执行步骤300到314的指令示例如下。在该示例中,创建合成模块和呈现目标。然后发送批处理打开控制包。发送要创建合成节点、描绘数据资源、以及合成环境的命令。根节点在合成环境上设置,而合成环境在hwnd目标上设置。此时,合成节点、合成环境、描绘数据资源、根节点以及hwnd目标相关联。然后创建资源。资源是几何图形资源、原彩色画笔资源、以及笔资源。然后发送更新包以更新笔、把椭圆添加到几何图形资源中、并画出几何图形。然后画出经填充的长方形,描绘数据在合成节点上设置,并更新合成节点。为了删除该合成,发送资源释放命令以释放资源,并去除合成装置。
main()
{
Mil CompositionDevice_Create(&g_hCompositionDevice );
//Creates the device->generates a connect packet.
//handled by composition proxy that creates a client composition
device for this connection.
MilResource_HWndRenderTarget_Create(&g_hRenderTarget);
//create a render target->generates a resource command to create
the rendertarget resource.
MilCompositionDevice_CreateBatch(&hBatch);
//Opens a batch->generates a batch open control packet
// handled by client composition device.
MilResource_CompositionNode_Create(&g_hRootNode);
//create a composition node->generates a resource command packet to
create a composition node.
MilResource_RenderData_Create(&g_hRenderData);
//create a render data resource->generates a resource command
packet to create a render data.
MilResource_CompositionContext_Create(&g_hCompositionContext);
//create a composition context command->generates a resource
command packet to create a composition context.
MilCompositionContext_SetRootNode(g_hCompositionContext,
g_hRootNode,
hBatch);
//set the root node on the composition context->generates a
resource command to set the root node on the context
// packet is handled by composition context resource
MilResource_HWndRenderTarget_SetCompositionContext(g_hRenderTarget,
g_hCompositionContext,
hBatch));
//set the composition context on the hwnd target->generates a
resource command packet to set the comp context on hwnd target
//packet is handled by the hwnd target resource.
MilResource_Geometry_Create(&hGeometry);
//create a geometry resource->generates a resource command packet
that creates a geometry resource.
MilResource_SolidBrush_Create(&hSolidBrush);
//create a solid brush resource->generates no packet.
MilResource_SolidBrush_Update(hSolidBrush,
1.0,
NULL,
&color,
g_hColor,
hBatch);
//set the color on the solid->generates a resource command packet
that creates a brush resource with the given color.
MilResource_Pen_Create(&g_hPen);
//create a pen resource->generates a resource command packet that
creates the pen resource.
MilResource_Pen_Update(g_hPen,
hSolidBrush,
5,
g_hPenWidth,
MilPenCapFlat,
MilPenCapFlat,
MilPenCapFlat,
MilPenJoinMiter,
10,
0,
NULL,
0.0,
NULL,
hBatch
);
//update the pen->generates a pen update packet
// handled by the pen resource
MilGeometry_UpdateEllipse(hGeometry,
NULL,
100.0,
NULL,
50.0,
NULL,
100.0,
100.0,
NULL,
hBatch);
//update the geometry to contain an ellipse ->generates a geometry
update packet
// handled by the
geometry resource
MilRenderData_DrawGeometry(g_hRenderData,
hSolidBrush,
g_hPen,
hGeometry
);
//draw the geometry to the render data->generates a render data
update packet to draw the geometry
// handled by the render data
resource
MilRenderData_FillRectangle_InlineSolidBrush(g_hRenderData,
200,
200,
300,
300,
colory
);
//draw a filled rectangle using a specified brush to the render data
->generates a render data update packet
//
handled by the render data resource
MilCompositionNode_SetRenderData(g_hRootNode,g_hRenderData,hBatch);
//sets the render data on a composition node->generates a
composition node update packet
// handled by the comp
node resource
MilBatch_Commit(hBatch);
// generates a bath close/commit packet.
// handled by client composition device.
//this is the notification processing loop
do
{
WaitOnEvents();
MilCompositionDevice_ProcessNotifications(g_hCompositionDevice);
//here we internally process notification packets coming from the
client composition device.
} while(composition still running:controlled by layer using the
compositor);
//all the resource release calls generate resource destroy packets
and queue flush control packets.
// handled by client composition device.
MilResource_Release(g_hCompositionContext);
MilResource_Release(g_hRootNode);
MilResource_Release(g_hHandleTable,g_hRenderData);
MilResource_Release(g_hPen);
MilResource_Release(g_hColor);
MilResource_Release(g_hPenWidth);
MilResource_Release(g_hITarget);
MilCompositionDevice_Destroy(g_hCompositionDevice);
//on exiting the loop we shut down
}
LONG_PTR lMainWindowProc1
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
HRESULT hr=S_OK;
HMIL_BATCH hBatch=NULL;
switch(message)
{
case WM_ERASEBKGND:
return 0;
case WM_SIZE:
if(g_hHandleTable &&
g_hRenderTarget &&
g_hCompositionDevice)
{
MilCompositionDevice_CreateBatch(
g_hCompositionDevice,
&hBatch);
//sends an open batch packet.
// handled by client composition device.
MilResource_HWndRenderTarget_Resize(g_hRenderTarget,
LOWORD(lParam),
HIWORD(lParam),
hBatch);
//resize render target->sends a render target resize
resource command
// handled by render target resource
MilBatch_Commit(hBatch);
//send close/commit batch control packet
// handled by client composition device.
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
if((ps.rcPaint.left<ps.rcPaint.right)&&
(ps.rcPaint.top<ps.rcPaint.bottom)&&
g_hCompositionDevice)
{
MilCompositionDevice_CreateBatch(
g_hCompositionDevice,
&hBatch));
// sends an open batch packet.
// handled by client composition device.
MilBatch_Commit(hBatch);
// send close/commit batch control packet
// handled by client composition device.
}
EndPaint (hwnd,eps);
}
break;
case WM_DESTROY:
if(g_hCompositionDevice)
{
MilCompositionDevice_CreateBatch(
g_hCompositionDevice,
&hBatch;
// sends an open batch packet.
MilResource_Release(
g_hHandleTable,
g_hRenderTargst);
//send a resource delete control packet
// handled by client composition device.
MilCompositionDevice_FlushChangeQueue(
g_hCompositionDevice);
//send a queue flush control packet.
// handled by client composition device.
MilBatch_Commit(hBatch);
//send close/commit batch control packet
// handled by client composition device.
}
PostQuitMessage(0);
break;
}
return(DefWindowProc(hwnd,message,wParam,lParam));
}
由前述可见,已揭示了在远程装置上创建和控制合成的方法和协议。该协议使服务器和其装置能利用远程装置的处理能力来呈现远程装置上的合成。这使服务器能处理更多的客户机,因为服务器无需处理用以真正呈现该合成的功能(例如绘、画、动画等)。这导致能够发挥更多客户机侧硬件的能力,诸如客户机的3D硬件加速管道以及客户机CPU。例如,客户机能处理动画功能,它使服务器能够向客户机发送描述动画功能的信息,而不是向客户机发送各动画帧。
由于许多可能实施例可应用本发明原理,应理解在此参照附图所述的实施例仅是说明性的,且不应作为本发明范围的限制。例如,本领域技术人员将理解,所示实施例的显示于软件中的元素可在硬件中实现,反之亦然,或者所示实施例可在排列和细节上作改动而不背离本发明的精神。因此,在此所述的本发明期望所有实施例可出自以下权利要求及其等效方案的范围内。
Claims (21)
1.一种在装置上呈现一组合成的方法,其特征在于,所述方法包括以下步骤:
发送一创建合成节点包,用于创建一合成;
发送至少一创建资源包,以创建用于呈现所述合成的资源;以及
发送至少一呈现更新包,以创建所述合成。
2.如权利要求1所述的方法,其特征在于,还包括发送一创建描绘数据资源包,以创建一描绘数据资源的步骤。
3.如权利要求1所述的方法,其特征在于,还包括发送一批处理打开包以打开一批处理过程的步骤。
4.如权利要求3所述的方法,其特征在于,还包括以下步骤:
发送多个创建资源包;
发送至少一个资源更新包;以及
发送一结束/呈现批处理包。
5.如权利要求1所述的方法,其特征在于,还包括发送一释放命令以释放一资源的步骤。
6.一种数据结构,其特征在于,包括:
一第一字段,具有一包类型;
一第二字段,具有一句柄,所述句柄匹配所述包类型;
一第三字段,具有匹配所述包类型的资源类型和命令类型之一;以及
一第四字段,具有一命令。
7.如权利要求6所述的数据结构,其特征在于,所述包类型是控制包和资源命令包之一。
8.如权利要求7所述的数据结构,其特征在于,所述控制包和资源命令包之一包括所述控制包、所述资源命令包、以及一批处理包中之一。
9.如权利要求6所述的数据结构,其特征在于,所述句柄包括资源句柄、环境句柄、以及合成节点句柄之一。
10.如权利要求6所述的数据结构,其特征在于,所述资源类型和命令类型之一包括资源类型,所述资源类型包括存储、位图、变换、几何图形以及笔之一。
11.如权利要求10所述的数据结构,其特征在于,所述资源类型还包括动画类型。
12.如权利要求11所述的数据结构,其特征在于,所述动画类型包括双重动画、色彩动画、点动画、长方形动画、以及尺寸动画之一。
13.如权利要求6所述的数据结构,其特征在于,所述资源类型包括合成节点、以及合成环境之一。
14.如权利要求6所述的数据结构,其特征在于,所述控制类型包括释放资源的释放一资源类型、关闭一装置的关闭类型、以及删除装置上所有的同步类型之一。
15.如权利要求6所述的数据结构,其特征在于,所述控制类型包括将位图添加到字形缓存器的添加字形位图类型、从所述字形缓存器移除位图的释放字形位图类型、以及排空变化队列的排空队列类型之一。
16.一种在装置上呈现合成的方法,其特征在于,所述方法包括以下步骤:
响应于接收一创建合成节点包,创建一合成节点;
响应于接收至少一个创建资源包,创建至少一个用于呈现所述合成的资源;以及
响应于接收至少一个呈现更新包,创建所述合成。
17.如权利要求16所述的方法,其特征在于,还包括响应于接收一创建描绘数据资源包,创建一描绘数据资源的步骤。
18.如权利要求16所述的方法,其特征在于,还包括响应于接收一批处理打开包打开一批处理过程的步骤。
19.如权利要求18所述的方法,其特征在于,还包括响应于接收一结束/呈现批处理包,处理至少一创建资源包和至少一资源更新包的步骤。
20.如权利要求16所述的方法,其特征在于,还包括响应于接收一释放命令,释放一资源的步骤。
21.如权利要求16所述的方法,其特征在于,还包括响应于接收一命令包,发送一通知的步骤。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10/692,371 | 2003-10-23 | ||
US10/692,371 US7711840B2 (en) | 2003-10-23 | 2003-10-23 | Protocol for remote visual composition |
PCT/US2004/024012 WO2005046102A2 (en) | 2003-10-23 | 2004-07-26 | Protocol for remote visual composition |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101411164A true CN101411164A (zh) | 2009-04-15 |
CN101411164B CN101411164B (zh) | 2011-09-14 |
Family
ID=34549897
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2004800013345A Expired - Fee Related CN101411164B (zh) | 2003-10-23 | 2004-07-26 | 用于呈现远程可视合成的方法 |
Country Status (11)
Country | Link |
---|---|
US (1) | US7711840B2 (zh) |
EP (1) | EP1676385B1 (zh) |
JP (1) | JP4691037B2 (zh) |
KR (1) | KR101031963B1 (zh) |
CN (1) | CN101411164B (zh) |
AU (1) | AU2004279201B2 (zh) |
BR (1) | BRPI0406435A (zh) |
CA (1) | CA2501555A1 (zh) |
MX (1) | MXPA05006623A (zh) |
RU (1) | RU2005120235A (zh) |
WO (1) | WO2005046102A2 (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7500227B1 (en) * | 2004-06-22 | 2009-03-03 | Unisys Corporation | Process and system for intercepting a .NET method at runtime |
US8386628B1 (en) * | 2005-05-23 | 2013-02-26 | Glance Networks, Inc. | Method and apparatus for reducing the amount of information that must be transmitted to slower viewers over a remote viewing session |
US7885979B2 (en) * | 2005-05-31 | 2011-02-08 | Sorenson Media, Inc. | Method, graphical interface and computer-readable medium for forming a batch job |
US7975219B2 (en) * | 2005-05-31 | 2011-07-05 | Sorenson Media, Inc. | Method, graphical interface and computer-readable medium for reformatting data |
US8296649B2 (en) * | 2005-05-31 | 2012-10-23 | Sorenson Media, Inc. | Method, graphical interface and computer-readable medium for generating a preview of a reformatted preview segment |
US8108799B2 (en) * | 2007-03-30 | 2012-01-31 | Microsoft Corporation | Remoting of windows presentation framework based applications in a non-composed desktop |
US20080250424A1 (en) * | 2007-04-04 | 2008-10-09 | Ms1 - Microsoft Corporation | Seamless Window Implementation for Windows Presentation Foundation based Applications |
US8484291B1 (en) | 2008-04-02 | 2013-07-09 | Glance Networks, Inc. | Method and apparatus for selecting commands for transmission from an updated queue |
US8771064B2 (en) | 2010-05-26 | 2014-07-08 | Aristocrat Technologies Australia Pty Limited | Gaming system and a method of gaming |
US9471194B2 (en) | 2013-10-29 | 2016-10-18 | Microsoft Technology Licensing, Llc | Rendering windows having transparent properties from a remote desktop environment |
US9396698B2 (en) * | 2014-06-30 | 2016-07-19 | Microsoft Technology Licensing, Llc | Compound application presentation across multiple devices |
CN110796726B (zh) * | 2018-08-01 | 2022-04-05 | 深圳朗呈医疗科技有限公司 | 一种三维成像方法、装置及终端设备 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5581737A (en) * | 1994-09-12 | 1996-12-03 | International Business Machines Corporation | Method and apparatus for expansion, contraction, and reapportionment of structured external storage structures |
ATE331390T1 (de) * | 1997-02-14 | 2006-07-15 | Univ Columbia | Objektbasiertes audiovisuelles endgerät und entsprechende bitstromstruktur |
JPH10301874A (ja) * | 1997-04-22 | 1998-11-13 | Internatl Business Mach Corp <Ibm> | 遠隔操作方法、ネットワークを介して端末から遠隔操作されるサーバ及びhtmlファイルを格納する記憶媒体 |
JP4343432B2 (ja) * | 1998-02-12 | 2009-10-14 | イー−プラス キャピタル,インコーポレイティド | 高効率のクライアントサーバ、タイル化およびキャッシングアーキテクチャを使用するネットワーク画像ビューサーバ |
US7199836B1 (en) * | 1998-02-13 | 2007-04-03 | The Trustees Of Columbia University In The City Of New York | Object-based audio-visual terminal and bitstream structure |
JP3683133B2 (ja) * | 1999-08-17 | 2005-08-17 | 日本電気株式会社 | パケットスケジューリング装置 |
CA2388095A1 (en) | 1999-10-22 | 2001-05-03 | Activesky, Inc. | An object oriented video system |
US7043697B1 (en) * | 2000-05-15 | 2006-05-09 | Intel Corporation | Virtual display driver |
JP4269532B2 (ja) * | 2001-03-30 | 2009-05-27 | ブラザー工業株式会社 | データ解析プロバイダシステム、データ解析プロバイダ、データ解析方法及びデータ解析プログラム |
US7064766B2 (en) * | 2001-10-18 | 2006-06-20 | Microsoft Corporation | Intelligent caching data structure for immediate mode graphics |
US7161599B2 (en) * | 2001-10-18 | 2007-01-09 | Microsoft Corporation | Multiple-level graphics processing system and method |
US20030110211A1 (en) * | 2001-12-07 | 2003-06-12 | Danon David Jean-Philippe | Method and system for communicating, creating and interacting with content between and among computing devices |
AUPR947701A0 (en) * | 2001-12-14 | 2002-01-24 | Activesky, Inc. | Digital multimedia publishing system for wireless devices |
US7376695B2 (en) * | 2002-03-14 | 2008-05-20 | Citrix Systems, Inc. | Method and system for generating a graphical display for a remote terminal session |
US7088374B2 (en) * | 2003-03-27 | 2006-08-08 | Microsoft Corporation | System and method for managing visual structure, timing, and animation in a graphics processing system |
US8264489B2 (en) * | 2003-07-11 | 2012-09-11 | Intel Corporation | Interface remoting |
-
2003
- 2003-10-23 US US10/692,371 patent/US7711840B2/en not_active Expired - Fee Related
-
2004
- 2004-07-26 CN CN2004800013345A patent/CN101411164B/zh not_active Expired - Fee Related
- 2004-07-26 CA CA002501555A patent/CA2501555A1/en not_active Abandoned
- 2004-07-26 KR KR1020057008147A patent/KR101031963B1/ko active IP Right Grant
- 2004-07-26 EP EP04779187.6A patent/EP1676385B1/en not_active Expired - Lifetime
- 2004-07-26 JP JP2006536571A patent/JP4691037B2/ja not_active Expired - Fee Related
- 2004-07-26 AU AU2004279201A patent/AU2004279201B2/en not_active Expired - Fee Related
- 2004-07-26 MX MXPA05006623A patent/MXPA05006623A/es not_active Application Discontinuation
- 2004-07-26 BR BR0406435-6A patent/BRPI0406435A/pt not_active IP Right Cessation
- 2004-07-26 WO PCT/US2004/024012 patent/WO2005046102A2/en active Application Filing
- 2004-07-26 RU RU2005120235/09A patent/RU2005120235A/ru not_active Application Discontinuation
Also Published As
Publication number | Publication date |
---|---|
CA2501555A1 (en) | 2005-04-23 |
MXPA05006623A (es) | 2005-08-16 |
KR20060113840A (ko) | 2006-11-03 |
AU2004279201B2 (en) | 2009-06-04 |
BRPI0406435A (pt) | 2005-10-04 |
CN101411164B (zh) | 2011-09-14 |
WO2005046102A2 (en) | 2005-05-19 |
WO2005046102A3 (en) | 2009-04-09 |
JP4691037B2 (ja) | 2011-06-01 |
EP1676385A4 (en) | 2015-02-25 |
EP1676385B1 (en) | 2018-03-07 |
AU2004279201A1 (en) | 2005-06-23 |
US20050102321A1 (en) | 2005-05-12 |
US7711840B2 (en) | 2010-05-04 |
JP2007519074A (ja) | 2007-07-12 |
KR101031963B1 (ko) | 2011-04-29 |
EP1676385A2 (en) | 2006-07-05 |
RU2005120235A (ru) | 2006-01-20 |
AU2004279201A8 (en) | 2008-10-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5319875B2 (ja) | アプリケーション・メタデータを用いるグラフィカル・ユーザ・インターフェースの適応ビデオ圧縮法 | |
JP5373135B2 (ja) | 代替的グラフィック・セットの効率的な符号化 | |
CN101258478B (zh) | 高级图形流 | |
CA2514832C (en) | System and method for compression of wireless applications expressed in a structured definition language | |
US7839401B2 (en) | Management of enterprise systems and applications using three-dimensional visualization technology | |
US20030069963A1 (en) | System and method of quality of service signaling between client and server devices | |
CN101411164B (zh) | 用于呈现远程可视合成的方法 | |
WO2001077897A2 (en) | System and method using a web catalog with dynamic multimedia data using java | |
US12106527B2 (en) | Realtime conversion of macroblocks to signed distance fields to improve text clarity in video streaming | |
Wilson et al. | Using CORBA middleware to support the development of distributed virtual environment applications | |
AU2003202442B2 (en) | A Client Server Approach for Interactive Updates of Graphical User Interfaces on Intranets | |
Stavrakakis et al. | Exposing application graphics to a dynamic heterogeneous network | |
Hege et al. | Distributed Visualization with OpenGL Vizserver | |
Barton et al. | Making Computers Disappear: Appliance Data Services | |
IWASAKI | DisPlay: Mitigating Heavy-duty Networking Latency and Error through Cross-platform Multithreaded Channel Coding and Media Compression | |
CA2461922A1 (en) | System and method of quality of service signaling between client and server devices |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150515 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20150515 Address after: Washington State Patentee after: MICROSOFT TECHNOLOGY LICENSING, LLC Address before: Washington State Patentee before: Microsoft Corp. |
|
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20110914 |