要說到全部的架構實在太多了,有很多地方也不是很明白
如果有看skia源碼的朋友歡迎和我討論。目前有一個核心問題SkBitmapProcShader 的shaderSpan過程其實並不複雜,但是涉及到浮點和定點的一些東西SkFix和float之間的轉換。很難完全弄明白,如果有懂的朋友誠心請教
1. skia的基本原理
skia是Android系統底層的圖形映像繪製庫,主要提供各類向量圖形、位元影像圖形、字型等的繪製工作。其處理過程如下所述:
以drawBitmap為例描述skia大致架構:
首先:是公用主線, SkCanvas類提供調用介面給java JNI調用,基本上上層java命名和SkCanvas類的介面命名一致。
Skia公用主線如下:
SkCanvas::drawBitmap –>SkDevice::drawBitmap ->SkDraw::drawBitmap
其中Device的概念對應螢幕的一部分或者整個螢幕。所有的畫圖或者渲染操作都不能超過Device的界限,這是它主要的作用。
Bitmap重要的2D操作有如下幾種,平移(transform),縮放(scale),傾斜(skew)。在skia中這幾種操作都由Matrix類控制,其核心思想是“點對點的矩陣映射”。不同的操作對應不同的渲染路線,重要渲染路線有如下幾種(以支路2為例重點介紹)。
支路1:如果Bitmap僅僅只是平移或者連平移也不做(由just_translate進行判斷)。則是如下調用過程:
SkDraw::drawBitmap ->SkBlitter::ChooseSprite(選擇渲染類如Sprite_D32_S32)
-> blitter::blitRect(子類member func)-> S32A_Opaque_BlitRow32
支路2:如果Bitmap有縮放(scale),則是如下調用過程:
首先說明skia shader的概念。Shader可以理解為渲染。如填充一些規則變化的顏
色,以顏色填充為例skiashader有3中LinearGradient RadialGradientSweepGradient,所有的shader都會intstall in paint,來保留shader調用介面。畫圖的時候如果存在shader,則會以shader的方式進行渲染而不是paint設定的color.
SkDraw::drawBitmap->SkAutoBitmapShaderInstallconstructor(Bitmap以shader的方式渲染的架構構建 ,並且將建立SkBitmapProcShader intall in paint)
->draw.drawRect(Bitmap以drawRect架構方式畫圖,以BitmapShader方式渲染)
->SkAutoBlitterChoose constructor(選擇渲染類如SkARGB32_Shader_Blitter)
-> blitter::blitRect(注意是子類的member function,進行具體的blit操作)
->SkARGB32_Shader_Blitter::blitH->SkBitmapProcShader::shadeSpan(至關重要的一步,其作用是將位元影像資料以shader的方式寫入一個臨時buffer,寫入過程相當複雜,並且不同的位元影像配置有不同的調用介面)。
->S32A_Opaque_BlitRow32(上一步的臨時buffer中的位元影像資料和整個螢幕(devices)相應的位置進行blit操作)
支路3:如果Bitmap有更加複雜的操作如旋轉(rotate),甚至傾斜(Skew),則Bitmap的繪製會在drawPath內部進行。有如下調用過程。
draw.drawRect-> SkDraw::drawPath
-> SkAutoBlitterChoose constructor(同樣在建構函式中是選擇渲染類)
-> SkScan::FillPath(Bitmap會在裡面以shader方式渲染。和drawrect方式一樣)