天天看點

07.顯示系統:第006節_基礎知識_Region定義及操作

上小節我們講解了surfaceflinger對Vsync信号的處理,現在我們來回顧一下,在android系統中存在一個或者多個應用程式,每個程式有一個或者多個Layer。surfaceflinger在對Vsync信号進行處理的時候,會對每一個Layer更新他的資料,接下來他就把這些更新了資料的個個層與Layer合并起來,在顯示裝置上顯示出來。

在講解界面顯示之前,我們先來補充一些基礎知識,Region定義及操作。下面是一個示意圖:

07.顯示系統:第006節_基礎知識_Region定義及操作

假如上圖是我們的手機螢幕,Z軸代表圖像的高度。假設運作了三個應用程式,在最前面的應用程式(APP1)的z軸最大,APP2在中間位置,APP3在最下面,很顯然,我們眼睛看到的APP1,他可以全部都顯示出來,APP2會被APP1,遮擋一部分,同樣,APP3會被APP1與2遮擋一部分,也有可能完全看不見了。

一個界面其按照透光度,可以分為3個區域:1.opaque-完全不透明。2.transparent-全透明。3.translucent-半透明。

對于不透明的程式,其會遮蓋後面的程式,對于全頭面的程式,他不會 遮蓋後面的程式,并且全透明的區域你可以不用去繪畫他。對于半透明的程式,你需要繪畫半透明區域,但是他不會遮蓋後面的應用程式。

我們需要一個結構體表示這些區域,這個結構體我們稱之為Region,假設一個手機界面,如下:

07.顯示系統:第006節_基礎知識_Region定義及操作

Region由一系列的矩形組成,并且

1.從上到下,從左到右依次排序,

2.各矩形的Y軸坐标,要麼相同(對于Y軸坐标相同的矩形,x軸坐标不交叉), 或者無交叉。

我們引入一個概念,span(一組):一組Rect,Y軸一樣,x坐标無交叉。

Region:由一組Y軸無交叉的span組成。

我們檢視源代碼,在Region.h中

class Region : public LightFlattenable<Region>
	Vector<Rect> mStorage;
           

Vector mStorage;這個向量中存放着一個一個的矩形。其最後一項表示邊界,如果Region隻有一個Rect,那麼mStorage久隻含有一項,即隻有一個Rect。

如果Region有兩個Rect,那麼mStorage含有3個Rect,這意味着mStorage永遠不會有2個Rect。

下面我們開始講解對Region的操作。我們如圖:

07.顯示系統:第006節_基礎知識_Region定義及操作

假設有兩個Region,但是每個Region隻有一個Rect,

Region r1(0,0,2,2)

Region r2(1,1,3,3)

1.andself操作,即r1.andself(r2)-》r1 and r2。為(1,1,2,2)

2.orself,r1.orslef。即Rect(0,0,2,1),Rect(0,1,3,2),Rect(1,2,3,3),

繼續閱讀