Core Graphic(一):歷史與介紹
原文地址:http://www.bignerdranch.com/blog/core-graphics-part-1-in-the-beginning/
Mac和iOS為開發者提供了許多不同的API用於使用者介面的開發。UIKit和AppKit庫都擁有很多image,color和path類。Core Animation提供了layer層展示的API。使用OpenGL可以渲染3-D畫面。Spritekit可以實現一些列動畫。AVFoundation提供了播放視訊/音訊的介面。
Core Graphic又被稱作“Quartz”,它是一個早期被被用來在系統中實現一系列圖形相關的API庫。Quartz是2-D畫面渲染的基礎。用Core Graphic庫可以實現各種圖形,形狀的繪製,填充,陰影效果,還能合成影象,建立PDF檔案。可見功能非常強大。
CG(Core Graphic)是一個相當大的圖形API庫,包括基本的幾何圖形元素(點,大小,向量和矩形等),還能對這些元素進行操作,渲染影象中的元素,所有這些都是通過事件處理來完成的。你可以建立“Tap事件”,用來監聽互動事件(滑鼠點選,螢幕觸控和鍵盤輸入)。
看到上面這些介紹,比較困惑的就是為什麼圖形API可以處理使用者事件?這些都是歷史遺留問題。如果對這些歷史有所瞭解就能理解為什麼CG是這麼設計的。
一切要從PostScript談起
讓我們把時間倒回到1980年,當年鄧麗君還在風風火火。當時的圖形API跟今天的比起來還很小兒科。那時的API提供的功能也有限,你只能從很少的顏色中選取一種,然後畫畫線,畫畫圖形,你還能通過一個個的畫素點來組成一個圖形。當時Mac上有一個叫做AuickDraw的軟體,能完成一些比較酷的操作,它能畫出不規則的圖形,並實現填充,剪下等功能。但說到頭來,這些API還都是停留在對畫素進行操作。
1985年,蘋果開發出了一款兼做鐳射印表機的裝置,這個裝置比當時的計算機價格要高出兩倍。這個印表機中安裝了一個微處理器器,比電腦上的強大的多。這個印表機依靠了一種叫做PostScript的技術,能打印出非常漂亮的圖片。
PostScript是由Adobe發明的一種基於堆疊的程式語言,和FORTH很相似。通過PostScript技術可以建立向量圖形(使用數學公式進行描述的圖形),而不是通過畫素這種方式。鐳射印表機中有一個用來解釋PostScript的處理器,當需要列印圖形的時候,可以現在Mac中編好程式,然後下載到印表機中,就可以開始列印了。
下面有一張關於PostScript的Demo,左邊是程式,右邊是效果:
你可以在 中下載該專案。
將影象用程式來進行表示,是一個非常天才的設計。程式可以通過編寫特定的演算法來描述圖形,這樣的好處的就是通過這些演算法,可以輸出任意精度的解析度圖形。不管是300dpi還是1200dpi都是用的同一套程式碼。
PostScript不光可以用來渲染影象,它其實就是一個程式語言,可以用來設計web server。
NeXT
當NeXT的工程師在設計他們的系統的時,他們選擇了PostScript作為渲染模型。他們拓展了PostScript模型(DPS),並使其可以在螢幕上顯示出來,而不僅僅是通過印表機輸出,但是核心還是PostScript技術。NeXT設計出的程式可以在螢幕顯示和印表機輸出上使用同一個程式碼,並且還能將PostScript嵌入到C程式中。
DPS是使用者介面的基礎,事件響應(滑鼠,鍵盤等)也一併通過DPS整合到了軟體中。
除了NeXT系統之外,Sun公司的NeWS系統也是使用的PostScript技術來驅動使用者介面系統的。
Quartz
前面說了這麼多,但為什麼Mac和iOS不是用的PostScript呢?因為,錢!Adobe持有PostScript的版權,凡是使用者都要交版權費。而且,蘋果還有一個特點就是,它希望自己能掌握核心技術,而不是使用別人的。他們實現了和PostScript同等功能的技術,這樣可以避免交版權稅,還能擁有自己的core graphic程式碼。
大家一種公認為Quartz是“基於”PDF實現的,這麼說也是有一些道理的。PDF(Adobe’s protable Document Format)是一個PostScript繪畫模型實現的,它遵循嚴格的編碼規則。Quartz也實現了一套和PDF所相容的的APIs。
Quartz保留了基本的實現機制,甚至是DPS中的事件處理也被Quartz包含進來了,但是DPS的實現已經完全被Quzrtz所替代,下圖可以看到程序棧裡出現了DPS的字樣:
基本架構
下一章會對Quartz有更加深入的講解。我們平時所提到的“影象”,實際在計算機中被抽象成“渲染”,“渲染”可以將影象顯示在NSView物件中,或者在UIImage中顯示,甚至可以通過PDF來顯示。
所有通過CG來繪畫的都叫做“context”,context是一個集合,它將所有的資料結構和函式收集起來,然後控制它們如何進行渲染。
有許多不同種類的context,例如NSWindowGraphicsContext(Mac)。這個context將渲染影象的程式碼放到記憶體中的一個共享區域中,window server從這個共享區域取出程式碼,然後顯示在螢幕上。
另一個CG context是image context。編寫的程式碼是通過一個個的畫素表現,然後這些畫素在組成點陣圖。你可以將這個點陣圖context嵌入到其他的context中,或者儲存為PNG,JPEG格式。這裡還有一種叫PDF的context,這種context的繪畫編碼不是變成一個個的畫素,而是轉換程PDF指令碼儲存成檔案。當PDF閱讀器開啟這個檔案的時候,可以將這些指令碼進行解析,渲染,轉變成我們可以閱讀的樣式。