/*以下前半段主要整理自
Cairo官網的
Tutorial及其他*/
有關任何function的參數/行為細節等請查閱
這裡CairoGraphics主要有兩個基本的概念
Nouns和
Verbs※※※ Nouns ※※※大多是一些抽象的surface,是構成整個Cairo畫面的基本元件
Destination
或稱Destination Surface,是我們基本的作畫平面
可以是一個像素陣列或是一些檔案(.SVG,.PDF,etc...)
Source
相當於顏料(paint)
但是Source除了單色以外,還可以是更複雜的形式
例如另一個Destination或是樣式(Pattern)
也還可以加上透明度(Transparency)
Mask
Mask是介於Source和Destination之間的過濾版
僅有被Mask允許的地方Source才能投影/映射到Destination上面
Path
路徑(Path)的資訊會被紀錄在文本(Context)之上
直到我們使用繪出(Draw)之類的動詞之時,
Context中的Path才會直接轉換成一個Mask
並且透過這個Mask將Source投影到Destination上面
Context
Context是一個資料載體
其包含了該圖片絕大多數的資訊
context紀錄所有會被動詞(Verbs)影響的資訊/名詞
例如當前的Destination,Source,Mask,以及一些其他的資訊
像是筆觸(Stroke),位移(Translate)等等
最重要的,Context紀錄了上一個動詞之後到目前為止所有的Path
※※※ Verbs ※※※是由數個實際存在的function合稱而成
主要的功能就是將目前Context的內容pop出來並且根據不同的Verb執行不同的繪畫
Stroke
Stroke就是沿著Path畫線
Fill
單純的把Path內部填滿Source上的顏色或圖片Text/Glyphs
做為動詞,我目前僅知showText這個方法
另外也可以用textPath和glyphPath配合fill來間接產生文字
Paint
就是單純的全頁面Source覆蓋
有兩種形式:無透明的paint和有透明的paintWithAlphaMask
作為Verb的Mask相當單純,就相當於覆蓋(Paint)
唯一的差別是執行Mask還需要一個Pattern來當作Mask(名詞)
另外還需要注意Compositing Operator對於Mask動作的影響
接下來是更多的整理和常用工具的列表
※※※ Pattern ※※※Pattern大致上有三種
withRGBPattern/withRGBAPattern
withLinearPattern
withRadialPattern
分別是單色樣式,線性漸層樣式,圓形漸層樣式
漸層樣式可以使用patternAddColorStopRGB(RGBA)來增加漸層色點
Pattern有兩種用途
作為Mask動作的Mask(名詞) : (mask pattern)
或是直接轉換作為Source : (setSource pattern)
實做上面則需要注意一點
withXXXPattern的最後一個參數都是一個(Pattern -> Render a)的function
這可以視為withXXXPattern會產生一個只存在於該function內的Pattern實體
也就是說所有需要這個Pattern的動作都要在這個function中完成
看個例子就很好理解
withRadialPattern 45.0 45.0 10.0 45.0 45.0 40.0 (\pattern -> do
patternAddColorStopRGBA pattern 0.0 1.0 1.0 1.0 1.0
patternAddColorStopRGBA pattern 1.0 0.5 0.5 0.0 0.5
mask pattern)
關於Mask和Clip這篇Notes中並沒有細談
因筆者個人需求問題所以暫時沒有計畫去研究這個部份
有興趣可以自己參考
這裡或是
這裡※※※ Setting Stroke ※※※Stroke有一些基本常見的設定
setLineWidth 設定線寬
setDash 設定虛線
setLineCap
CAP 設定端點
setLineJoin
JOIN 設定接點(折點)
CAP(端點)有三種選擇
LineCapButt 平面
LineCapRound 圓角
LineCapSquare 方塊
JOIN(接點)也有三種選擇
LintJoinMiter 尖角
LintJoinBevel 斜切角
LintJoinRound 圓角
※※※ Save/Restore ※※※Save和Restore是一組很好用的工具
Save會紀錄下現在Context中的State資訊(不包含Path)
Restore則是會回到上一次Save的狀態
這組工具在需要來回切換數組狀態時相當方便
例如說
setSourceRGB 1.0 0.0 0.0
moveTo 0.0 0.0
lineTo 5.0 5.0
stroke
save
setSourceRGB 0.0 0.0 1.0
moveTo 5.0 5.0
lineTo 10.0 10.0
stroke
restore
moveTo 10.0 10.0
lineTo 15.0 15.0
stroke
會畫出一條紅-藍-紅的線段
※※※ Transformation/Matrix ※※※基本的轉換大致有三種
translate 平移
scale 縮放
rotate 旋轉
中心點都是在圖形的左上角
transformation也是save/restore的對象
另外,Matrix也可以用來做transformation
Cairo裡面另外有專門做Matrix運算的package: Graphics.Rendering.Cairo.Matrix
該package裡面有很多function可以產生/修改一個Matrix實體
(參考
這裡)
而自行產生的Matrix實體可以由transform來執行
或是由setMatrix/getMatrix來運用
※※※ Path Tool ※※※moveTo 移動
lineTo 直線
curveTo 曲線
relMoveTo 相對移動
relLineTo 相對直線
relCurveTo 相對曲線
arc 弧線
arcNegative 負角度的弧線
rectangle 矩形Path
textPath 產生字串的Path
closePath 封閉現在的Path
newPath 清除之前的Path
最後一個,也是最複雜的重點
※※※ Compositing Operator ※※※Compositing Operator是Cairo在進行影像合成時的模式
不同的Operator會造成兩個圖形合成出不一樣的結果
主要是影響透明度和彩度
官方的說明在
這裡以下完全是根據自己的理解整理出來的 XD
(Surface都是指Destination)
{ "較"單純的Operator }OperatorClear (Bounded)
將source當作橡皮擦,把交集的部份清除
OperatorSource (Bounded)
完全無視Source的透明度,直接蓋上去
OperatorDest (Both)
禁畫模式,source畫什麼都會失敗
OperatorXOR (Both)
看半天看不懂,太複雜了 Orz
不懂他的公式怎樣出來的?
又代表什麼意思 ?
OperatorAdd (Both)
透明度直接加總(最大到1)
彩度上,兩者都根據自己原本的透明度而縮小之後再相加
換句話說,越不透明就用能保有較多的彩度
最標準的融合模式!!
OperatorSaturate (Both)
透明度取直接加總(最大到1)
顏色上,兩者都縮小之後再加成
但是source會縮的比surface小(也就是說,會以surface的原色為重)
有點類似於把source當作浮水印蓋上去{ 有相反模式的Operator }("不會"吃掉surface或是source的圖)OperatorOver (Both)
彩度和透明度都是 以source基礎,加上surface的弱化
是Cairo的Default Operator
OperatorDestOver (Both)
彩度和透明度都是 以surface基礎,加上source的弱化
{ 有相反模式的Operator }(但是"會"吃掉surface或是source的圖)OperatorOut (Unbounded)
圖形使用source給的(surface但非交集的部份全部砍掉)
彩度按照source不變
透明度是根據surface的透明度而更加透明
surface透明度=0 -> 完全按照source透明度
surface透明度=1 -> 透明度0
OperatorDestOut (Both)
完全顛倒於OperatorOut
圖形使用surface
彩度照surface
透明度根據surface的透明度而更加透明
Out 有點像是把surface當作一塊會造成透明化的板子,然後兩者疊合
DestOut 則是將source當作那塊透明化板
OperatorIn (Unbounded)
只會繪出新舊交集之處
透明度是原本兩者相乘 = 變小
彩度按照Source
OperatorDestIn (Unbounded)
完全同上,只是彩度改成按照Surface
OperatorAtop (Unbounded)
只繪出surface
透明度完全照surface
顏色基本上是兩者加總,但是會根據source的透明度加成
source透明度=0 -> 以surface色彩為準
source透明度=1 -> 以source色彩為準
OperatorDestAtop (Unbounded)
只繪出source
透明度完全照source,
基本上是兩者加總,但是會根據surface的透明度加成
surface透明度=0 -> 以source色彩為準
surface透明度=1 -> 以surface色彩為準
就像是在交集的地方多塗上一層對方的顏料
而這個顏料的濃度則是根據對方的透明度決定
題外一下
我自己測試Mask只有在下面四個Operator有效果
Add, DestOver
Out, DestAtop
不過其實這裡還有很多細節要另外去研究
所以不是很肯定(簡單說就是不懂 XD)
以上,是我最近幾天在試的東西 :)
有待研究的主要是Mask和Clip
還有如何在GTK+的元件上面繪圖