【譯】Core Graphics,第一部分:序章

原文連接:Core Graphics, Part 1: In the Beginning - Mark Dalrymplegit

譯文原鏈:【譯】Core Graphics,第一部分:序章github

Mac 和 iOS 開發者有許多不一樣的讓東西顯示在屏幕上的編程接口。UIKit 和 AppKit 有各類各樣的 image、color 和 path 類。Core Animation 讓你能夠移動 layer。OpenGL 讓你能夠在三維空間渲染東西。SpriteKit 讓你能夠作動畫。AVFoundation 讓你能夠播放視頻。算法

Core Graphics,或者它在市場中被人熟知的名字「Quartz」,是這個平臺上最老的圖形相關 API 之一。Quartz 構建了大多數二維的東西的基礎。想要畫些圖形,給它們填充上漸變而且加上陰影?用 Core Graphics。想要在屏幕上合成圖片?Core Graphics 能解決。想要建立 PDF?仍是 Core Graphics。編程

CG 是一個至關大的 API,包括了從基本的幾何數據結構(例如:點、大小、向量和矩形)和用於操做它們的方法、用於將像素渲染進圖片或者屏幕的東西,一直到事件處理。你能夠用 CG 來建立「events taps」,它能幫你監聽和操做應用中的事件流(鼠標點擊、屏幕點擊、任意鍵盤按鍵)。服務器

好吧。最後一項是有點奇怪。爲何一個 graphics API 要處理用戶事件呢?這啊和別的同樣,還得從歷史提及。並且瞭解一點歷史也能夠幫助理解爲何 CG 是那樣工做的。數據結構

歷史中的 PostScript

從時間的迷霧往回看(二十世紀八十年代,Duran Duran 還在上升期時),graphic API 相比今天還很是初級。你能作的只有從有限的色盤中挑選顏色、繪製獨立的像素點、連線和畫一些基本的圖形好比矩形和橢圓。你能夠設置剪切範圍來告訴別人,「嘿,這兒不能畫,」並且有時候你會有一些不受控的特性好比調整線有多寬。常常會有一些「像素位塊傳輸」的功能用於將像素塊處處複製。Mac 上的 QuickDraw 有一個很酷的功能叫作 regions,它能讓你建立任意形狀的區域而後使用它們來繪製、剪切、繪製輪廓或者 hit -test。不過基本上,當時的 API 都是面向像素的。架構

1985 年,Apple 發佈了 LaserWriter,一個是其連接的計算機價格兩倍的打印機。它包含一個比其連接的計算機更強勁的微處理器,以及一個 12 倍的 RAM。歸功於一個叫作 PostScript 的技術,這款打印機(在當時)製做出了魅力驚人的打印製品。編程語言

PostScript 是一個來自 Adobe 的基於棧的計算機語言,與 FORTH 相似。PostScript, 這種技術,是爲了建立矢量圖(藝術的數學描述)而非基於像素。在 LaserWriter 中內嵌了一個 PostScript 解釋器,所以當 Mac 上的程序想要打印什麼東西的時候,這個程序(或者某個打印機驅動)將會生成一段程序代碼,將其載入打印機並執行。函數

下面是一個 PostScript 代碼的例子以及結果圖像:post

你能夠在 Github 上找到這個項目。

將頁面用代碼形式來展示是一個很是重要的設計上的決策。這使得程序能夠以算法的形式展示頁面中的內容,所以用於執行這段程序的設備可以用其最大分辨率來繪製頁面。對於當時大多數打印機,這個值是 300dpi。對於其餘的,1200dpi。它們都是由一樣的生成的程序繪製的。

除了渲染頁面,PostScript 是圖靈完備的,而且能夠被看成通用編程語言。你甚至能夠用它寫 Web Server。

Companion CuBEs

NeXT 工程師在設計他們的系統時,他們選擇了 PostScript 做爲渲染模型。Display PostScript,簡稱 DPS,擴展了 PostScript 模型,使其可以在窗口化的計算機顯示器工做。不過其核心還是一個 PostScript 解釋器。NeXT 的應用能夠用 PostScript 代碼實現其屏幕繪製,而且用同一段代碼進行打印。你一樣也能夠用 C 函數來包裹 postScript (使用一個叫 pswrap 的程序)以從應用代碼中調用。

Display PostScript 是用戶交互的基礎。事件(鼠標、鍵盤、更新等等)經過 DPS 系統而後被分發到應用中去。

NeXT 並不是當時惟一使用 PostScript 的窗口化系統。Sun 的 NeWS(除了名字像以外,和 NeXT 沒有一點關係)也有一個用於驅動系統中用戶交互的內嵌 PostScript 解釋器。

說說 Quartz

爲何 OS X 和 iOS 不用 Display PostScript?基本上是錢的緣由。Adobe 收取 Display PostScript 證書費用。同時,Apple 也是有名的想要儘量有更多他們自有的技術棧。經過實現 PostScript 繪製模型,但並不真正使用 PostScript,他們既避免了付證書費也有了 Core Graphics 的代碼。

有一種廣泛的說法是 Quartz 是「基於」 PDF 的,在某種意義上的確如此。PDF 就是沒有任意編程功能的 PostScript 繪製模型。Quartz 被設計成其 API 的典型使用和 PDF 自己支持的很是接近,以致於在這個平臺上建立 PDF 幾乎不費吹灰之力。

哪怕 Display PostScript 被 Quartz 取代了,一樣的基本原理被保留下來了,包括事件處理。看看 Cocoa 棧軌跡的 18 幀吧。DPS 仍在!

基礎架構

我會在接下來的幾周講到更多 Quartz 細節的各個方面,可是有一個重點是用於「畫東西」的那段代碼被從實際圖形渲染中抽象出來了。「渲染」能夠是「讓東西在 NSView 中顯示」,或者「讓東西顯示在 UIImage 裏面」,甚至是「讓東西顯示在 PDF 中」。

你全部的 CG 繪製都在一個「context(上下文)」中執行,它是數據結構和用於控制如何繪製的方法的指針的集合。

Context 有不少種,好比(在 Mac 上)有 NSWindowGraphicsContext。這一特定 context 獲取你的代碼安排的繪製指令,而後在你的應用的地址空間裏中一塊共享內存裏繪製出像素。這一段內存也與窗口服務器共享。窗口服務器將全部正在運行的應用的窗口表面樣子一塊兒展現在屏幕上。

另外一種 CG Context 是一種圖片 context。任何你運行的繪製代碼都會將像素佈置在一個位圖圖片中。你可使用這個圖片來繪入其它 context 中或者做爲 PNG 或 JPEG 保存在文件系統。一樣也有一個 PDF context。運行的繪製代碼不會變成像素,而是變成了 PDF 命令並被存進一個文件中。此後,PDF查看器可使用那些 PDF 命令來渲染成某種能夠查看的東西。

接下來

下一次,更近距離來看看 context,以及一些 Core Graphics 中的便捷 API。

相關文章
相關標籤/搜索