亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

谷歌瀏覽器的源碼分析(34)

系統(tǒng) 2911 0
通過上一次的分析,我們看到所有網(wǎng)頁數(shù)據(jù)經(jīng)過 HTML 分析器之后,都會變成一個一個 RenderObject 對象,那么這些 RenderObject 對象又是怎么樣顯示到界面上面的呢?現(xiàn)在就帶著這個疑問來分析下面的代碼,這樣肯定會找到解決方法的。怎么樣找到入口呢?其實(shí)可以先從界面顯示的類開始,可以看到顯示界面的窗口類名稱叫做 Chrome_RenderWidgetHostHWND, 有了這個類名稱,就可以到代碼里查看它在那里了。

#001 ? class RenderWidgetHost;

#002 ? class WebMouseEvent;

#003 ? class WebCursor;

#004 ?

#005 ? typedef CWinTraits<WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>

#006 ????? RenderWidgetHostHWNDTraits;

#007 ?

#008 ? static const wchar_t* const kRenderWidgetHostHWNDClass =

# 009 ????? L "Chrome_RenderWidgetHostHWND";

?

可看到這個窗口類名稱是定義在這里,再跟著 kRenderWidgetHostHWNDClass 來查找,就會找到顯示窗口,如下:

#001 ? class RenderWidgetHostHWND :

#002 ??? public CWindowImpl<RenderWidgetHostHWND,

#003 ?????????????????????? CWindow,

#004 ?????????????????????? RenderWidgetHostHWNDTraits>,

#005 ??? public RenderWidgetHostView {

#006 ?? public:

#007 ??? RenderWidgetHostHWND(RenderWidgetHost* render_widget_host);

#008 ??? virtual ~RenderWidgetHostHWND();

#009 ?

#010 ??? void set_close_on_deactivate(bool close_on_deactivate) {

#011 ????? close_on_deactivate_ = close_on_deactivate;

#012 ??? }

#013 ?

#014 ??? void set_parent_hwnd(HWND parent) { parent_hwnd_ = parent; }

#015 ?

#016 ??? DECLARE_WND_CLASS_EX(kRenderWidgetHostHWNDClass, CS_DBLCLKS, 0);

?

通過上面的分析,就可以找到顯示網(wǎng)頁的窗口類 RenderWidgetHostHWND ,在這個類里,主要顯示的位置是在 void RenderWidgetHostHWND::OnPaint(HDC dc) 函數(shù)里面,它的代碼如下:

#001 ? void RenderWidgetHostHWND::OnPaint(HDC dc) {

#002 ??? DCHECK(render_widget_host_->process()->channel());

#003 ?

#004 ??? CPaintDC paint_dc(m_hWnd);

#005 ??? HBRUSH white_brush = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));

#006 ?

#007 ??? RenderWidgetHost::BackingStore* backing_store =

#008 ??????? render_widget_host_->GetBackingStore() ;

#009 ?

#010 ??? if (backing_store) {

#011 ????? gfx::Rect damaged_rect(paint_dc.m_ps.rcPaint);

#012 ?

#013 ????? gfx::Rect bitmap_rect(

#014 ????????? 0, 0, backing_store->size().width(), backing_store->size().height());

#015 ?

#016 ????? gfx::Rect paint_rect = bitmap_rect.Intersect(damaged_rect);

#017 ????? if (!paint_rect.IsEmpty()) {

#018 ??????? BitBlt(paint_dc.m_hDC,

#019 ?????????????? paint_rect.x(),

#020 ?????????????? paint_rect.y(),

#021 ?????????????? paint_rect.width(),

#022 ?????????????? paint_rect.height(),

#023 ?????????????? backing_store->dc(),

#024 ?????????????? paint_rect.x(),

#025 ?????????????? paint_rect.y(),

#026 ?????????????? SRCCOPY);

#027 ????? }

......

#058 ? }

?

其實(shí)這個函數(shù)是通過如下發(fā)送消息給另一個進(jìn)程進(jìn)行渲染成 BMP 的圖片,

Send(new ViewMsg_Repaint(routing_id_, view_size));

?

那么誰來接收 ViewMsg_Repaint 消息呢?繼續(xù)細(xì)心地查找,就到在如下類函數(shù)里處理:

void RenderWidget::OnMsgRepaint(const gfx::Size& size_to_paint)

在這個函數(shù),并不是最終的結(jié)果,它又會調(diào)用其它線程來處理渲染,以便達(dá)到異步的結(jié)果。它的調(diào)用過程如下:

1) ? RenderWidget::DoDeferredPaint() ? 線程里開始渲染網(wǎng)頁顯示

2) ? RenderWidget::PaintRect() 窗口里開始進(jìn)行顯示

3) ? WebViewImpl::Paint() web 視類開始顯示。

4) ? WebFrameImpl::Paint() web 框架類開始顯示。

5) ? WebCore::ScrollView::paint() 滾動窗口顯示。

6) ? WebCore::Frame::paint() WebCore 里的框架顯示。

7) ? WebCore::RenderLayer::paint() 分層顯示。

8) ? WebCore::RenderLayer::paintLayer()

9) ? WebCore::RenderBlock::paint() ? 在每一層里顯示每一塊區(qū)域。

10) ??? WebCore::RenderBlock::paintObject() 顯示這一區(qū)域的對象。

11) ??? WebCore::RenderBlock::paintContents() 顯示需要顯示的內(nèi)容。

12) ??? WebCore::RenderFlow::paintLines() 這里需要顯示文字。

13) ??? WebCore::RootInlineBox::paint() 開始顯示一行文字。

14) ??? WebCore::InlineFlowBox::paint() 進(jìn)行一行文字排列。

15) ??? WebCore::InlineTextBox::paint() ?

16) ??? WebCore::GraphicsContext::drawText() ? 進(jìn)行一個一個文字顯示。

17) ??? WebCore::Font::drawText() ? 這里調(diào)用字體類來把文字的編碼變成位圖。

18) ??? WebCore::Font::drawSimpleText() ? 這里把位圖顯示到界面內(nèi)存里。

?

通過上面的分析,可以看到顯示一串文字的過程是如此復(fù)雜的過程。其它圖片顯示的過程也是一樣,都把它們變成位圖,然后再分層顯示出來。那么 JavaScript 是怎么樣顯示的呢?這個會比上面的過程更加復(fù)雜,后面再仔細(xì)地分析它。下一次,主要仔細(xì)地看看這些過程里的一些類功能。

谷歌瀏覽器的源碼分析(34)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色综合a怡红院怡红院首页 色综合h | 乱色美www女麻豆 | 伊人久久综合谁合综合久久 | 日韩毛片高清在线看 | 国产乱码精品一区二区三区四川 | 思思久久99热这里只有精品66 | 国产精品深爱在线 | 欧美不卡在线视频 | 欧美一区二区三区精品影视 | 久久9966精品国产免费 | 久久网站在线观看 | 欧美成人观看视频在线 | 日本成人a视频 | 成人毛片免费免费 | 日韩免费一级毛片 | 久久99久久99精品免观看麻豆 | 日本免费在线一区 | 视色视频在线观看 | 97成人免费视频 | 免费视频网站一级人爱视频 | 中文字幕在线视频不卡 | 国产性较精品视频免费 | 国产综合精品一区二区 | 伊人网综合在线观看 | 91官网 | 99久久爱re热6在播放 | 50-60岁老妇女一级毛片 | 最新国产在线视频 | 乱色 另类图区 | 成人性生交大片免费看午夜a | 国产区成人精品视频 | 成人久久18免费网站游戏 | 视频大全在线观看免费 | 2020久久精品永久免费 | 国产乱码亚洲精品一区二区 | 人做人爱视频欧美在线观看 | 青青久久久国产线免观 | 午夜大片免费男女爽爽影院久久 | 久久精品操 | 亚洲和欧美毛片久久久久 | 91在线免费视频观看 |