Quartz的Quartz 2D部分是提供图形渲染服务的图形库之一。它是为展现二维文本和图形所设计的。图形和多媒体库包括
·渲染二维图像的QuickDraw
·既可以渲染二维图像也可以渲染三维图像的OpenGL
·表现数字视频流和其他多媒体的QuickTime
QuickTime是一种交互式多媒体环境,具有图形环境和应用程序环境上的功能和特性。尽管考虑到它在Mac OS X架构中所处的混合状态,但是在这一节中,作为简单的概括,我们仍将把它看作为是与Quartz 2D、QuickDraw和OpenGL地位同等的图形库。
所有的渲染库都直接依赖于Quartz的另外部分,即Quartz Compositor层。然而,QuickTime和OpenGL却几乎不依赖于Quartz Compositor层,因为它们有它们自己的某种特定视窗实现机制。
Quartz Compositor由Mac OS X视窗服务器和由它所实现的(当前私有的)系统编程接口(SPI)来组成。视窗服务器对显示和窗口全面负责,其中包括它们的合成、配置和基本管理。同时,它也执行低级别的指针管理和事件路由。
很大程度上Quartz是在核心图形框架(CoreGraphics.framework)中实现的。如图3-4所示,这一框架中的动态共享库,包含客户端API和服务器SPI,其中服务器SPI是由视窗服务器自身实现的。应用程序或应用程序环境与Quartz 2D库的客户方相链接,这些库用于渲染屏幕、生成PDF和其它服务。所有对服务器SPI的访问都是由客户端API来转交的。
在某种程度上,Cocoa环境和Java环境为访问Quartz 2D和其它渲染库提供了它们自己的编程接口。您既可以使用Cocoa和Java接口,也可以使用在应用服务层上的编程接口。
这一节的余下部分所讨论的是,在图形和视窗环境下的Quartz所扮演的角色。关于QuickDraw、QuickTime和OpenGL的概念内容请参考相关的Apple开发文档(developer.apple.com)。
Quartz Compositor
Mac OS X的Quartz Compositor层由视窗服务器和由视窗服务器所实现的(私有的)系统编程接口(SPI)所组成。这一层负责对初始屏幕显示、视窗合成与管理、事件路由和指针管理进行响应。
视窗服务器是一个单独的系统范围内的进程,用于协调低级别的视窗动作,并强制保持在屏幕上所显示视窗的基本一致性。它是一个轻量级的服务器,因为它自己不能进行渲染,但可以与位于其上层的客户图形库进行通讯。从绘画模型方面来说,它是“不会发表意见的”。
视窗服务器与其它系统服务和库几乎没有依赖关系。它依赖于内核环境中的I/O Kit(尤其是,用I/O Kit构建的设备驱动程序),为的是与框架缓冲器、输入设备的底层结构和输入输出设备进行通讯。它也与核心服务的某些框架相链接,以获取进程管理服务,如基本进程的激活。
视窗服务器的一个首要职责是视窗合成。当视窗在被绘制、被重画、覆盖和被覆盖时,由它来合成每一个应用程序的视窗像素。每个视窗都被描述成一幅位图,它包括了半透明(alpha通道)和抗锯齿信息。位图作为缓冲器允许视窗服务器去“记住” 一个应用程序的视窗内容,并在不干涉应用程序的情况下将它进行再合成。然而,视窗服务器(Quartz Compositor)没有记忆那些被图形库(例如Quartz 2D)用来创建视窗和其它图象的矢量信息。取而代之的是,位图被应用程序和视窗服务器所共享,应用程序直接对共享位图进行绘画操作,并相应地由视窗服务器来合成该位图。
在它的Quartz Compositor组件中,Quartz以一个分层式的合成引擎来作为视窗系统的模型。传统的视窗系统使用"交换"模型,在这个模型中屏幕上的每一个像素完全属于一个视窗(或桌面)。因为这种模型,转变就必然很突然;举个例子来说,当您关闭一个视窗时,它会立刻消失。在另一方面,一个分层式合成视窗系统基于“图像(视频)混合”模型。在这个模型上,屏幕中的每一个像素都能够被视窗和视窗间实时共享(尤其是在半透明和抗锯齿特性上)。这种模型允许平滑地在图形用户界面的状态间进行转换,这是Aqua体验所带来的与众不同的特性之一。
Quartz 2D
Quartz的Quartz 2D是一个具有矢量特性的图形库。它的API允许您通过指定一系列命令和数学程式来生成文本与图像。这些命令和程式用来在二维空间内绘制线段,几何形状,颜色,阴影,半透明效果和其它图形属性,而您无需为每一个特定像素指定属性。作为结果,一个几何形状可有效地以一系列路径和属性的方式来定义,而不是以位图的方式来定义。
通过使用矢量,Quartz 2D也能使用一种坐标系来作为绘画的参照,比方说这种坐标系是以英寸或厘米为单位的,而不是基于像素栅格。这种坐标体系很灵活,允许不同的度量标准,并且当它不与任何一个屏幕分辨率绑定时,它具有一定程度的显示独立性。它还使用了浮点坐标。优先于Quartz Compositor的合成,Quartz 2D把以坐标系来表现的矢量图像信息转化为像素值。
Quartz 2D API是设备独立的,这意味着,绘画操作的最终目的文件可以是窗口位图,也可以是可移植文档格式(PDF)文件、PostScript文件或其它输出格式。当使用QuickDraw或其它输入机制来显示PDF文件时,应用程序可以直接或间接地调用Quartz 2D API。
用于Quartz 2D的主要输入方式是由QuickDraw和本机C API所生成的绘画命令和程式。(将来,更多的前端API可能会被支持)使用QuickDraw的应用程序可以通过CGContextRef接口来调用Quartz 2D,从而获得它的功能。而QuickDraw使应用程序可以由GrafPort接口来得到CGContextRef。
来自QuickDraw或本机API的命令和程式被即刻转换为所需的输出格式,这些输出格式既可以是屏幕渲染的位图数据、PostScript(PostScript打印机的打印数据格式),也可以是其它类型打印机的光栅数据。打印预览时,还可以自动发布PDF。将来,更多的后端转换器可能会被支持,例如:绘图仪。
正如前一段所提出的,Quartz 2D是Mac OS X打印系统的底层引擎。打印工作常常被分成二个步骤。Quartz 2D用于解释那些由本机C或QuickDraw API所构建的文本和图形,并将它们保存为PDF格式(主要的脱机打印格式)。这时,PDF可再次通过Quartz 2D,将其转换为适当的输出格式。
打印系统
Mac OS X打印系统为Macintosh开发人员提供了一个灵活而强大的全新打印环境。这种体系结构有利于应用程序开发人员在他们的程序中更好地提供对打印功能的支持,同时也有利于打印机供应商编写驱动程序和扩展打印对话框。Mac OS X的打印系统有着许多优于Mac OS 8和9的优点,包括如下:
·打印系统使用Quartz 2D进行渲染和转换服务。Quartz 2D支持具有独立分辨率的PDF绘画模型,允许应用程序在所有级别的光栅和PostScript打印机上的进行高品质和经过颜色管理的打印件输出。
·漂浮对话框允许同时打开多个打印对话框,并向一个打印机队列中发送多个打印作业。
·打印对话框可以由打印对话框扩展来定制。页面设置对话框可以由应用程序开发人员来扩展,同时打印机供应商及应用程序开发人员都可以扩展打印对话框。
·打印机模块代替了打印机驱动程序。打印机模块要比打印机驱动程序更易于编写,因为驱动程序中的大量代码现在已经为您预先编写好了,它们被存放在苹果公司所提供的I/O模块和打印系统的一些其它部分中。
·打印应用程序编程接口(API)包含对Carbon应用程序的强健支持。Carbon开发人员可以编写一个能在Mac OS X中运行的应用程序,同时它也能在Mac OS 8和9中运行。Cocoa开发人员通过使用Cocoa对象和方法来支持打印功能。Cocoa方法调用了Carbon打印管理器API.
这个全新打印系统在设计上的一个关键之处在于它对Carbon应用程序的强健支持。由于Mac OS X中的Carbon打印管理器与Mac OS 8和9中的打印管理器一样被很好的支持,所以正如预期的那样,Carbon应用程序能够在两种环境中执行相同的打印任务。举个例子来说,当运行Mac OS 8或Mac OS 9时,应用程序使用传统的用户界面和驱动程序;而在Mac OS X中,应用程序将自动利用到新打印系统中更为一致、灵活的打印对话框和打印架构。
打印系统的用户界面
Mac OS X打印系统的用户界面为执行打印相关任务提供了一个一致和易于使用的环境。这些 打印相关任务包括:查找本地和网络打印机,配置新打印机,选择打印机和管理打印作业。新打印系统的人性化接口允许用户处理简单的日常打印任务,和复杂的、多文档的、多打印机的打印作业。
打印系统的用户界面由以下部分组成:
·打印中心 允许用户查找、选择和配置可用的打印机,并确定与各打印机相联系的打印作业状态。
·页面设置对话框 允许用户指定所要打印文档的格式。
·打印对话框 允许用户指定打印作业的参数,并在指定的打印机上进行文件打印。
·简化打印对话框 允许用户指定常用的打印作业参数,而无需逐个浏览打印对话框中的各个设置面板。
相对于Mac OS 8和9的打印模型来说,在易用性和稳定性方面,新打印系统的接口包含了许多重要的改进。在处置打印机时,以前的Chooser(选配器)容易让用户混淆了大部分的公共资源,现在Chooser被Print Center(打印中心)所替代。打印中心结合了许多Chooser和桌面打印的功能特性,组成为一个独立的集成化接口。与Chooser不同,打印中心是一个独立于Finder的单一应用程序,它不再需要用Finder来支持打印接口,并简化了代码,提高了系统稳定性。针对所有的打印机,页面设置和打印对话框被充分标准化。而且,新打印系统允许通过第三方定制来方便地进行打印功能扩展。
打印架构概要
Mac OS X打印架构由9个模块组成。从概念上来说,这些模块可以被分为客户端模块和服务器模块。应用服务框架和Carbon框架组成客户端模块,为应用程序提供绘画和打印API。打印中心和可选的打印机浏览器模块在打印循环中处理客户响应。余下的5个模块,打印模块服务器、打印作业管理器、转换器、打印模块和I/O模块,组成打印系统服务器的后端,它从本地客户端接受打印作业并把它们交给目标打印机。
·Carbon框架 实现了可供应用程序使用的Carbon打印管理器API。用于显示打印和页面设置对话框,从应用程序取得绘画信息,并把打印数据传递给打印服务器。
·应用服务框架 包含用于Carbon、Cocoa和BSD UNIX应用程序的通用打印功能。这一框架不实现任何打印对话框界面,但这些界面会在Carbon框架中得到实现。
·打印对话框扩展(PDE) 通过它对打印或页面设置进行扩展,并让第三方添加用户界面元素来支持特定的打印机。PDE与打印机模块或Carbon应用程序相对应,它对由PDE提供的用户设置进行解释和应用。
·打印中心 允许用户查找和选择打印机,也可以控制和获取打印作业的状态信息。
·打印机浏览模块(PBM) 通过添加对其它打印连接方式(例如SCSI和FireWire)的UI支持,扩充了打印中心的功能。PBM与I/O模块相对应,该模块实现了对传送类型的支持。
·打印服务器 处理从应用程序中发出的打印作业队列。对打印中心的请求进行响应,处理或返回队列中的打印作业的状态信息。
·打印作业管理器 管理着那些能把单个打印作业转换成最终打印输出的不同进程。打印作业管理器宿主于打印模块和I/O模块。
·转换器 一个可选模块,通过转换打印作业的数据格式,来协助打印作业管理器。举例来说,一个转换器可以把PDF转换成光栅格式。
·打印模块 用于格式化打印机数据(例如:PostScript或PCL),处理打印机状态和错误状况。打印机模块一般由打印机供应商提供,以支持一台或一系列特定的打印机。
·I/O模块 为一种传输类型实现一个标准接口。苹果公司为NetInfo、USB、TCP/IP和AppleTalk提供了I/O模块。第三方也可以创建支持其他传输类型的模块。
·作业券(Job ticket) 包含所有控制打印作业所必需要的参数。由应用服务框架中的打印功能来控制作业券的创建。在打印过程的每一个步骤中,特定组件会更新作业券的状态。
打印机搜索
在用户选择打印机之前,打印中心必须首先列出有效的打印机。通过打印中心查找可用打印机的过程被称为“打印机搜索”。
在打印机搜索过程中,打印中心列举出所有安装在/System/Library/Printers和/Library/Printers目录中的I/O模块和打印机浏览器模块。打印服务器把从打印浏览器模块中得到的对不同连接类型的字符串描述传递给打印中心,打印中心则把这些字符串显示在关于连接类型的弹出式菜单中。
当用户选择一个连接类型时,打印中心列出所有安装在/System/Library/Printers和/Library/Printers目录中的打印模块,并询问每个打印机模块是否支持用户所选择的连接类型。如果支持的话,打印中心会从中查找信息。在搜索被支持连接类型的打印机时,打印机浏览器模块使用此信息作为搜索标准,并且在屏幕上显示这些信息。
当用户点击某个打印机,以把它添加到打印机列表中时,打印中心从打印机浏览器模块中得到该打印机的地址、图标和打印机模块信息。接着,打印中心使用此信息来生成一个新的打印队列,并将该打印机添加到列表中。
打印过程
一个应用程序把关于一个打印作业的信息存储在一个或多个打印对象中。打印对象包含了关于打印作业的信息,例如纸张大小和纸张来源,并且用于给打印服务器传送信息。打印系统提供了对默认的打印对象进行访问的功能,并可由应用程序对该打印对象进行修改。页面设置和打印对话框使用打印对象来获取对当前打印作业的用户设置。
在用户需要打印时,应用程序会显示页面设置和打印对话框。应用程序使用了Carbon框架中的函数以显示这些对话框。Carbon应用程序能够利用打印对话框扩展(PDF)来扩展对话框。打印对话框扩展让Carbon应用程序可以定义一些可选项目,用于指定应用程序的绘画环境,例如自定义页面布局。
当用户关闭打印对话框时,应用程序服务器框架从应用程序处接收绘画命令(QuickDraw、Core Graphics或一个 PDF文件),并把它们放入脱机文件。应用程序把脱机文件连同打印对象一起传递给打印系统。在获得应用程序数据之前,打印系统生成作业券以管理打印作业的设置和状态,然后把作业券连同脱机文件一起传送给打印服务器。打印服务器再把数据传送给打印作业管理器,由它对余下的打印过程进行管理。在把作业传送给打印服务器之前,应用程序已经完成了在整个打印过程中它所应负责的那部分工作。所有与打印作业有关的错误都会被异步传送回打印中心,以反馈给用户。
打印作业管理器首先查阅作业券以确定目标打印机,并询问目标打印机的相关打印模块,以找出它所要求的数据格式。如果有需要,打印作业管理器使用转换器来把所导入数据转换为目的打印模块所能接受的数据格式。接着,打印作业管理器把数据传送给打印模块,打印模块负责把所导入数据转换成打印机将用于渲染数据的原始命令。最后打印作业管理器从打印模块接收到打印机专有数据,并利用适合打印机连接类型的I/O模块把数据发送给打印机。
其他应用服务
应用服务层中的其它系统服务,通过提供能影响图形用户界面的各种对象和动作,来支持所有的应用程序环境。这一节将探讨这些服务的突出特点。由于Mac OS X的自然演进,应用服务层的组成结构也将会随时间的过去而有所变化。学习其当前所包含的内容,
进程管理器
Mac OS X中,由进程管理器来管理所有的进程。它对共享资源的访问进行控制,管理应用程序的调度和执行,并允许多个应用程序共享CPU时间和其它资源。当用户双击一个应用程序或一个文档图标时,Finder使用进程管理器来启动应用程序。进程管理器也提供了许多机制,允许您控制进程的执行,启动进程并获得有关进程的信息。
对于进程管理器的相关内容参见“多样性环境下的问题和可选项”一章中的“任务和进程”。
Carbon事件管理器
Carbon事件管理器把事件分配给合适的事件处理器,这种分配是基于事件类型和目标应用程序环境的。视窗服务器把它接收到的事件放到目标应用程序进程的运行循环端口中。Carbon事件管理器从端口获得事件,把它打包成合适的形式,并把它传递给应用程序(可以是 Carbon、Cocoa和Java)事件处理结构的最低层“容器”。要实现这一点,Carbon事件管理器需要经常确定哪个窗口是当前的活动窗口,在窗口上是否有键盘输入的焦点,等等。
更多关于Mac OS X事件处理的介绍,参见“追踪用户事件”。
Apple事件
Apple事件是一种高级事件,应用程序可以把它发送到本地或者远程计算机上的其它应用程序中,甚至可以发送给它们自己。Apple事件是Mac OS X中应用程序间通讯的主要机制。应用程序主要用它们来对其它应用程序的服务和信息发出请求,或者对这些请求提供响应。
系统级的脚本语言AppleScript,作为一项相关的技术同样也是Mac OS X的一部分。用户可以使用AppleScript发送Apple事件给应用程序。
剪贴板
Mac OS X中的剪贴板(也被称为“粘贴板”)是一种后台服务程序,它允许在应用程序间转移数据。在某些方面它与Mac OS 9中的剪贴板相似,但也有一些不同的地方。Mac OS X中的剪贴板可以对同一数据保留多种表现形式。它被所有正在执行的应用程序所共享使用,剪贴板中包含了用户进行剪切或复制的数据。当一个应用程序要把数据传送给另一个应用程序时,剪贴板同样也能帮助实现这一功能。剪贴板用于复制-剪切-粘贴操作,并在拖拽操作中作为一种数据传送机制。同时它也被服务用于在应用程序间的数据传送。
核心服务层Core Services
核心服务层包含了那些与图形用户界面无关的系统服务。该层包括Core Foundation、Carbon Core、CFNetwork 、Web服务和Open Transport。核心服务层主要由两个框架构成--核心服务包罗框架(CoreServices.framework)和核心基础框架(CoreFoundation.framework)。这一节讲的是在这些框架中比较突出的技术;对于其它技术(如:核心安全服务)不进行探讨。
核心基础Core Foundation
Core Foundation是一种提供底层软件服务的框架(CoreFoundation.framework),所提供的这些底层软件服务不论对应用服务、应用程序环境还是对应用程序本身都是十分有用的。使用Core Foundation所带来的一个好处就是:提高了在不同环境和层中的框架、库和应用程序之间共享代码和数据的性能。Core Foundation也能够通过Unicode字符串来容易地实现国际化,并提供了用于实现操作系统独立性的抽象概念。
在Core Foundation中需要使用隐含类型,您可以用这些类型来创建“对象”,每一个对象都有它自己的独立标识和值(或一系列值)。在创建这些对象时,Core Foundation为内存分配提供了特定工具。并且,它还具备了一些通用基本类型和多态函数,用以实现类型间操作。
Core Foundation包括了与一些编程实体相符合的隐含类型,这些编程实体如字符串、数组、代码字典、日期、整数和树。它还具备了一种用于插件的标准体系结构,以及一种用于动态查找、装载代码和位置相关资源的机制(和一套与其相对应的API)。另外,它所拥有的服务能够通过URL访问本地和远程资源,设立分布式通知中心,读写XML属性列表,解析XML以及读写每个用户和每台机器的预置参数。
Core Foundation的服务和它的相关隐含类型
基本服务
Base Services CFAllocator, 基本类型 定义了在整个Core Foundation API中被使用的基本类型和多态函数。
束服务
Bundle Services CFBundle 提供了一种极好的方法,用来组织、定位程序中不同类型的资源,包括:图像,声音,本地化字符串,和可执行代码。
集合服务
Collection Services CFArray, CFDictionary, CFTree, CFSet, CFBag 提供了对于常用数据结构连同相关功能的一种高级抽象,这些数据结构包括:数组、字典(关系数组或