Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_34031325
engine
提交
14930326
E
engine
项目概览
qq_34031325
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
14930326
编写于
8月 11, 2016
作者:
H
Hans Muller
提交者:
GitHub
8月 11, 2016
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added SceneBuilder culling (#2911)
上级
cee7fef7
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
46 addition
and
13 deletion
+46
-13
lib/ui/compositing/scene_builder.cc
lib/ui/compositing/scene_builder.cc
+43
-11
lib/ui/compositing/scene_builder.h
lib/ui/compositing/scene_builder.h
+3
-2
未找到文件。
lib/ui/compositing/scene_builder.cc
浏览文件 @
14930326
...
...
@@ -57,56 +57,78 @@ void SceneBuilder::RegisterNatives(tonic::DartLibraryNatives* natives) {
}
SceneBuilder
::
SceneBuilder
()
:
m_currentLayer
(
nullptr
),
m_currentRasterizerTracingThreshold
(
0
)
{}
:
m_currentLayer
(
nullptr
),
m_currentRasterizerTracingThreshold
(
0
)
{
m_cullRects
.
push
(
SkRect
::
MakeLargest
());
}
SceneBuilder
::~
SceneBuilder
()
{}
void
SceneBuilder
::
pushTransform
(
const
tonic
::
Float64List
&
matrix4
)
{
SkMatrix
sk_matrix
=
ToSkMatrix
(
matrix4
);
SkMatrix
inverse_sk_matrix
;
SkRect
cullRect
;
if
(
sk_matrix
.
invert
(
&
inverse_sk_matrix
))
inverse_sk_matrix
.
mapRect
(
&
cullRect
,
m_cullRects
.
top
());
else
cullRect
=
SkRect
::
MakeLargest
();
std
::
unique_ptr
<
flow
::
TransformLayer
>
layer
(
new
flow
::
TransformLayer
());
layer
->
set_transform
(
sk_matrix
);
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
cullRect
);
}
void
SceneBuilder
::
pushClipRect
(
double
left
,
double
right
,
double
top
,
double
bottom
)
{
const
SkRect
clipRect
=
SkRect
::
MakeLTRB
(
left
,
top
,
right
,
bottom
);
SkRect
cullRect
;
if
(
!
cullRect
.
intersect
(
clipRect
,
m_cullRects
.
top
()))
cullRect
=
SkRect
::
MakeEmpty
();
std
::
unique_ptr
<
flow
::
ClipRectLayer
>
layer
(
new
flow
::
ClipRectLayer
());
layer
->
set_clip_rect
(
SkRect
::
MakeLTRB
(
left
,
top
,
right
,
bottom
)
);
addLayer
(
std
::
move
(
layer
));
layer
->
set_clip_rect
(
clipRect
);
addLayer
(
std
::
move
(
layer
)
,
cullRect
);
}
void
SceneBuilder
::
pushClipRRect
(
const
RRect
&
rrect
)
{
SkRect
cullRect
;
if
(
!
cullRect
.
intersect
(
rrect
.
sk_rrect
.
rect
(),
m_cullRects
.
top
()))
cullRect
=
SkRect
::
MakeEmpty
();
std
::
unique_ptr
<
flow
::
ClipRRectLayer
>
layer
(
new
flow
::
ClipRRectLayer
());
layer
->
set_clip_rrect
(
rrect
.
sk_rrect
);
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
cullRect
);
}
void
SceneBuilder
::
pushClipPath
(
const
CanvasPath
*
path
)
{
SkRect
cullRect
;
if
(
!
cullRect
.
intersect
(
path
->
path
().
getBounds
(),
m_cullRects
.
top
()))
cullRect
=
SkRect
::
MakeEmpty
();
std
::
unique_ptr
<
flow
::
ClipPathLayer
>
layer
(
new
flow
::
ClipPathLayer
());
layer
->
set_clip_path
(
path
->
path
());
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
cullRect
);
}
void
SceneBuilder
::
pushOpacity
(
int
alpha
)
{
std
::
unique_ptr
<
flow
::
OpacityLayer
>
layer
(
new
flow
::
OpacityLayer
());
layer
->
set_alpha
(
alpha
);
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
m_cullRects
.
top
()
);
}
void
SceneBuilder
::
pushColorFilter
(
int
color
,
int
transferMode
)
{
std
::
unique_ptr
<
flow
::
ColorFilterLayer
>
layer
(
new
flow
::
ColorFilterLayer
());
layer
->
set_color
(
static_cast
<
SkColor
>
(
color
));
layer
->
set_transfer_mode
(
static_cast
<
SkXfermode
::
Mode
>
(
transferMode
));
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
m_cullRects
.
top
()
);
}
void
SceneBuilder
::
pushBackdropFilter
(
ImageFilter
*
filter
)
{
std
::
unique_ptr
<
flow
::
BackdropFilterLayer
>
layer
(
new
flow
::
BackdropFilterLayer
());
layer
->
set_filter
(
filter
->
filter
());
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
m_cullRects
.
top
()
);
}
void
SceneBuilder
::
pushShaderMask
(
Shader
*
shader
,
...
...
@@ -120,11 +142,14 @@ void SceneBuilder::pushShaderMask(Shader* shader,
layer
->
set_mask_rect
(
SkRect
::
MakeLTRB
(
maskRectLeft
,
maskRectTop
,
maskRectRight
,
maskRectBottom
));
layer
->
set_transfer_mode
(
static_cast
<
SkXfermode
::
Mode
>
(
transferMode
));
addLayer
(
std
::
move
(
layer
));
addLayer
(
std
::
move
(
layer
)
,
m_cullRects
.
top
()
);
}
void
SceneBuilder
::
addLayer
(
std
::
unique_ptr
<
flow
::
ContainerLayer
>
layer
)
{
void
SceneBuilder
::
addLayer
(
std
::
unique_ptr
<
flow
::
ContainerLayer
>
layer
,
const
SkRect
&
cullRect
)
{
DCHECK
(
layer
);
m_cullRects
.
push
(
cullRect
);
if
(
!
m_rootLayer
)
{
DCHECK
(
!
m_currentLayer
);
m_rootLayer
=
std
::
move
(
layer
);
...
...
@@ -141,6 +166,7 @@ void SceneBuilder::addLayer(std::unique_ptr<flow::ContainerLayer> layer) {
void
SceneBuilder
::
pop
()
{
if
(
!
m_currentLayer
)
return
;
m_cullRects
.
pop
();
m_currentLayer
=
m_currentLayer
->
parent
();
}
...
...
@@ -150,6 +176,12 @@ void SceneBuilder::addPicture(double dx,
int
hints
)
{
if
(
!
m_currentLayer
)
return
;
SkRect
pictureRect
=
picture
->
picture
()
->
cullRect
();
pictureRect
.
offset
(
dx
,
dy
);
if
(
!
SkRect
::
Intersects
(
pictureRect
,
m_cullRects
.
top
()))
return
;
std
::
unique_ptr
<
flow
::
PictureLayer
>
layer
(
new
flow
::
PictureLayer
());
layer
->
set_offset
(
SkPoint
::
Make
(
dx
,
dy
));
layer
->
set_picture
(
picture
->
picture
());
...
...
lib/ui/compositing/scene_builder.h
浏览文件 @
14930326
...
...
@@ -5,8 +5,8 @@
#ifndef FLUTTER_LIB_UI_COMPOSITING_SCENE_BUILDER_H_
#define FLUTTER_LIB_UI_COMPOSITING_SCENE_BUILDER_H_
#include <stack>
#include <stdint.h>
#include <memory>
#include "flutter/flow/layers/container_layer.h"
...
...
@@ -70,11 +70,12 @@ class SceneBuilder : public ftl::RefCountedThreadSafe<SceneBuilder>,
private:
explicit
SceneBuilder
();
void
addLayer
(
std
::
unique_ptr
<
flow
::
ContainerLayer
>
layer
);
void
addLayer
(
std
::
unique_ptr
<
flow
::
ContainerLayer
>
layer
,
const
SkRect
&
cullRect
);
std
::
unique_ptr
<
flow
::
ContainerLayer
>
m_rootLayer
;
flow
::
ContainerLayer
*
m_currentLayer
;
int32_t
m_currentRasterizerTracingThreshold
;
std
::
stack
<
SkRect
>
m_cullRects
;
};
}
// namespace blink
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录