android 2D圖形系統 skia架構基本分析(一)–以後整個skia呼叫歷程圖出來

來源:互聯網
上載者:User

要說到全部的架構實在太多了,有很多地方也不是很明白

如果有看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方式一樣)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.