Quartz 2D是iOS系統(tǒng)以及所有Mac OSX應(yīng)用內(nèi)核外的二維繪制引擎。可以使用* Quartz 2D* API來(lái)基于路徑繪制、具有透明度、陰影、以及layer透明度、顏色、反走樣渲染、生成PDF文件以及PDF文件的訪(fǎng)問(wèn)。Quartz 2D充分利用了圖形硬件的性能。
在iOS系統(tǒng)中,Quartz 2D可以和其它的圖形以及動(dòng)畫(huà)技術(shù)結(jié)合使用,其中包括核心動(dòng)畫(huà)、OpenGL ES以及UIKit。
頁(yè)面——page
Quartz 2D的呈像利用了繪制模型。在這個(gè)模型中,每個(gè)連續(xù)的繪制操作都會(huì)輸出到一個(gè)layer畫(huà)布上,通常稱(chēng)為page。頁(yè)面的繪制可以覆蓋更多的額外繪制操作來(lái)改。
圖1 描述了畫(huà)家模式的工作原理。圖形上面,左邊的圖先繪制藍(lán)色部分,然后繪制實(shí)心圖形,實(shí)心圖形覆蓋了藍(lán)色的除了邊緣之外的其它部分,最終得到了圖上所示的圖形。而圖形下面以完全不同的順序進(jìn)行繪制兩個(gè)部分,也得到了相應(yīng)的完全不同的圖形。
The Graphics Context——圖形上下文
Graphics Context是一種復(fù)雜的(CGContextRef)數(shù)據(jù)類(lèi)型,概述了將圖片繪制到PDF、bitmap、或者window上展示的Quartz信息。
你可以將圖形上下文想象成一個(gè)繪制的終點(diǎn)形式,如圖2所示。當(dāng)使用Quartz進(jìn)行繪制的時(shí)候,所有的設(shè)備相關(guān)特征都包含在所使用的圖形上下文當(dāng)中。換句話(huà)說(shuō),你可以通過(guò)不同的圖形上下文將同一個(gè)圖片繪制到不同的外設(shè)上面。
應(yīng)用中可用的圖形上下文有:
- bitmap圖形上下文可以繪制RGB顏色、CMYK顏色或者灰度圖到位圖上。bitmap是一個(gè)像素矩形數(shù)組,每個(gè)像素代表圖像的一個(gè)點(diǎn)。位圖圖像也叫作示例圖像。
-
PDF圖形上下文可以構(gòu)建一個(gè)PDF文件。在PDF文件中,圖形被保存在一系列的命令中。
- PDF文件可以包含多個(gè)頁(yè)面。
- 在不同設(shè)備上繪制PDF文件的時(shí)候,繪制的圖形會(huì)根據(jù)顯示的特征進(jìn)行優(yōu)化
- PDF文件有個(gè)特性,就是繪制的圖形上的某個(gè)點(diǎn)不會(huì)因?yàn)榉糯蠡蛘呖s小而犧牲圖形的細(xì)節(jié)。
- window圖形上下文可以在window上繪制圖形。因?yàn)?em>Quartz 2D繪圖引擎不是window管理系統(tǒng)內(nèi),所以需要使用應(yīng)用框架來(lái)獲取window上下文。
- layer圖形上下文(CGLayerRef)是一種屏幕外繪制。
Quartz 2D Opaque Data Types
Quartz 2DAPI定義了除了圖形上下文以外的多種復(fù)雜數(shù)據(jù)類(lèi)型。因?yàn)?em>Quartz 2DAPI是Core Graphics框架的一部分,所以這種數(shù)據(jù)類(lèi)型以及常規(guī)的操作都是以CG為開(kāi)頭的。
- 你可以通過(guò)創(chuàng)建一個(gè)PDFpage對(duì)象來(lái)旋轉(zhuǎn)或者展示PDF page,對(duì)圖形上下文執(zhí)行旋轉(zhuǎn)操作,并且* Quartz 2D*將圖形繪制到當(dāng)前圖形上下文上。
- 可以通過(guò)創(chuàng)建一個(gè)圖案對(duì)象來(lái)繪制圖案,定義構(gòu)成圖案的形狀,并且用* Quartz 2D*將其繪制在圖形上下文上。
- 可以給一個(gè)區(qū)域繪制軸向或者徑向的陰影對(duì)象,提供一個(gè)函數(shù)來(lái)指定沒(méi)一點(diǎn)的顏色。
圖3 描述的是Quartz 2D繪制的基礎(chǔ)
Quartz 2D中可用的數(shù)據(jù)類(lèi)型主要有:
- CGPathRef通過(guò)fill或者stroke的方式繪制矢量圖。
- CGImageRef用于基于您提供的圖像的位圖圖像和位圖掩蓋。
- CGLayerRef,表示可以重復(fù)繪制的繪制layer。
- CGPatternRef用于重復(fù)繪制
- CGShadingRef 和 * CGGradientRef*,被用來(lái)繪制梯度。
- CGFunctionRef,在繪制梯度陰影的時(shí)候會(huì)用到,用來(lái)定義一個(gè)擁有隨意個(gè)數(shù)的額浮點(diǎn)參數(shù)的回調(diào)函數(shù)。
- CGColorRef和* CGColorSpaceRef用來(lái)表示Quartz*如何繪制顏色的
- CGImageSourceRef and CGImageDestinationRef,可以使用來(lái)講數(shù)據(jù)變?yōu)榛蛘呓獬?em>Quartz
- CGFontRef,用來(lái)繪制文本
- CGPDFDictionaryRef, CGPDFObjectRef, CGPDFPageRef, CGPDFStream, CGPDFStringRef, and CGPDFArrayRef,用來(lái)訪(fǎng)問(wèn)PDF元數(shù)據(jù)
- CGPDFScannerRef and CGPDFContentStreamRef,用來(lái)分析PDF元數(shù)據(jù)
- CGPSConverterRef,用來(lái)將PostScript轉(zhuǎn)換為PDF類(lèi)型,在iOS系統(tǒng)中不可用
*Quartz 2D *坐標(biāo)系
如圖4 所示的Quartz 2D坐標(biāo)系定義了繪制圖形的范圍。
不同設(shè)備擁有不同的圖形性能基礎(chǔ),圖形的位置和大小必須以一個(gè)與設(shè)備無(wú)關(guān)方式來(lái)定義。例如,在屏幕展示設(shè)置上一英寸最多有96像素,但是打印機(jī)每英寸可以有300英寸。如果以設(shè)備層級(jí)定義坐標(biāo)系,那么在這個(gè)設(shè)備上展示的圖形很難再?zèng)]有變形的情況下繪制在其它設(shè)備上,他們展示出來(lái)的效果要么是放大了要么是縮小了。
iOS系統(tǒng)坐標(biāo)系如圖5所示:
內(nèi)存管理:對(duì)象所有權(quán)
Quartz使用Core Foundation內(nèi)存管理模型,對(duì)象引用計(jì)數(shù)器。當(dāng)一個(gè)對(duì)象被創(chuàng)建出來(lái)的時(shí)候,對(duì)象的引用計(jì)數(shù)器為1。當(dāng)引用保留這個(gè)對(duì)象的時(shí)候就會(huì)使引用計(jì)數(shù)器+1,并且在釋放該對(duì)象的時(shí)候會(huì)使引用計(jì)數(shù)器-1.當(dāng)引用計(jì)數(shù)器的值變?yōu)?的時(shí)候,這個(gè)對(duì)象就被釋放掉了。這種模式允許對(duì)象安全的分享其它對(duì)象的引用。
一個(gè)簡(jiǎn)單的規(guī)則就是:
- 如果你create或者copy了一個(gè)對(duì)象的時(shí)候,你就擁有了它,所以你必須釋放該對(duì)象。也就是說(shuō),如果你通過(guò)帶有create或者copy的函數(shù)方式創(chuàng)建了這個(gè)對(duì)象,當(dāng)你用完的時(shí)候必須釋放該對(duì)象,以防止發(fā)生內(nèi)存泄露現(xiàn)象
- 如果你通過(guò)不包括create或者copy字眼的方式持有一個(gè)對(duì)象,你不用去釋放他。這個(gè)對(duì)象會(huì)在將來(lái)的某個(gè)時(shí)刻被它的所有者所釋放