Quartz 2D是iOS系统以及所有Mac OSX应用内核外的二维绘制引擎。可以使用* Quartz 2D* API来基于路径绘制、具有透明度、阴影、以及layer透明度、颜色、反走样渲染、生成PDF文件以及PDF文件的访问。Quartz 2D充分利用了图形硬件的性能。
在iOS系统中,Quartz 2D可以和其它的图形以及动画技术结合使用,其中包括核心动画、OpenGL ES以及UIKit。
页面——page
Quartz 2D的呈像利用了绘制模型。在这个模型中,每个连续的绘制操作都会输出到一个layer画布上,通常称为page。页面的绘制可以覆盖更多的额外绘制操作来改。
图1 描述了画家模式的工作原理。图形上面,左边的图先绘制蓝色部分,然后绘制实心图形,实心图形覆盖了蓝色的除了边缘之外的其它部分,最终得到了图上所示的图形。而图形下面以完全不同的顺序进行绘制两个部分,也得到了相应的完全不同的图形。
The Graphics Context——图形上下文
Graphics Context是一种复杂的(CGContextRef)数据类型,概述了将图片绘制到PDF、bitmap、或者window上展示的Quartz信息。
你可以将图形上下文想象成一个绘制的终点形式,如图2所示。当使用Quartz进行绘制的时候,所有的设备相关特征都包含在所使用的图形上下文当中。换句话说,你可以通过不同的图形上下文将同一个图片绘制到不同的外设上面。
应用中可用的图形上下文有:
- bitmap图形上下文可以绘制RGB颜色、CMYK颜色或者灰度图到位图上。bitmap是一个像素矩形数组,每个像素代表图像的一个点。位图图像也叫作示例图像。
-
PDF图形上下文可以构建一个PDF文件。在PDF文件中,图形被保存在一系列的命令中。
- PDF文件可以包含多个页面。
- 在不同设备上绘制PDF文件的时候,绘制的图形会根据显示的特征进行优化
- PDF文件有个特性,就是绘制的图形上的某个点不会因为放大或者缩小而牺牲图形的细节。
- window图形上下文可以在window上绘制图形。因为Quartz 2D绘图引擎不是window管理系统内,所以需要使用应用框架来获取window上下文。
- layer图形上下文(CGLayerRef)是一种屏幕外绘制。
Quartz 2D Opaque Data Types
Quartz 2DAPI定义了除了图形上下文以外的多种复杂数据类型。因为Quartz 2DAPI是Core Graphics框架的一部分,所以这种数据类型以及常规的操作都是以CG为开头的。
- 你可以通过创建一个PDFpage对象来旋转或者展示PDF page,对图形上下文执行旋转操作,并且* Quartz 2D*将图形绘制到当前图形上下文上。
- 可以通过创建一个图案对象来绘制图案,定义构成图案的形状,并且用* Quartz 2D*将其绘制在图形上下文上。
- 可以给一个区域绘制轴向或者径向的阴影对象,提供一个函数来指定没一点的颜色。
图3 描述的是Quartz 2D绘制的基础
Quartz 2D中可用的数据类型主要有:
- CGPathRef通过fill或者stroke的方式绘制矢量图。
- CGImageRef用于基于您提供的图像的位图图像和位图掩盖。
- CGLayerRef,表示可以重复绘制的绘制layer。
- CGPatternRef用于重复绘制
- CGShadingRef 和 * CGGradientRef*,被用来绘制梯度。
- CGFunctionRef,在绘制梯度阴影的时候会用到,用来定义一个拥有随意个数的额浮点参数的回调函数。
- CGColorRef和* CGColorSpaceRef用来表示Quartz*如何绘制颜色的
- CGImageSourceRef and CGImageDestinationRef,可以使用来讲数据变为或者解除Quartz
- CGFontRef,用来绘制文本
- CGPDFDictionaryRef, CGPDFObjectRef, CGPDFPageRef, CGPDFStream, CGPDFStringRef, and CGPDFArrayRef,用来访问PDF元数据
- CGPDFScannerRef and CGPDFContentStreamRef,用来分析PDF元数据
- CGPSConverterRef,用来将PostScript转换为PDF类型,在iOS系统中不可用
*Quartz 2D *坐标系
如图4 所示的Quartz 2D坐标系定义了绘制图形的范围。
不同设备拥有不同的图形性能基础,图形的位置和大小必须以一个与设备无关方式来定义。例如,在屏幕展示设置上一英寸最多有96像素,但是打印机每英寸可以有300英寸。如果以设备层级定义坐标系,那么在这个设备上展示的图形很难再没有变形的情况下绘制在其它设备上,他们展示出来的效果要么是放大了要么是缩小了。
iOS系统坐标系如图5所示:
内存管理:对象所有权
Quartz使用Core Foundation内存管理模型,对象引用计数器。当一个对象被创建出来的时候,对象的引用计数器为1。当引用保留这个对象的时候就会使引用计数器+1,并且在释放该对象的时候会使引用计数器-1.当引用计数器的值变为0的时候,这个对象就被释放掉了。这种模式允许对象安全的分享其它对象的引用。
一个简单的规则就是:
- 如果你create或者copy了一个对象的时候,你就拥有了它,所以你必须释放该对象。也就是说,如果你通过带有create或者copy的函数方式创建了这个对象,当你用完的时候必须释放该对象,以防止发生内存泄露现象
- 如果你通过不包括create或者copy字眼的方式持有一个对象,你不用去释放他。这个对象会在将来的某个时刻被它的所有者所释放