Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sxychenjing
engine
提交
0a3c0b5e
E
engine
项目概览
sxychenjing
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
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,发现更多精彩内容 >>
提交
0a3c0b5e
编写于
11月 29, 2016
作者:
C
Chinmay Garde
提交者:
GitHub
11月 29, 2016
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Allow platform frameworks to snapshot FlutterView contents. (#3281)
上级
03f68e99
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
94 addition
and
0 deletion
+94
-0
shell/platform/darwin/ios/BUILD.gn
shell/platform/darwin/ios/BUILD.gn
+1
-0
shell/platform/darwin/ios/framework/Source/FlutterView.mm
shell/platform/darwin/ios/framework/Source/FlutterView.mm
+93
-0
未找到文件。
shell/platform/darwin/ios/BUILD.gn
浏览文件 @
0a3c0b5e
...
...
@@ -53,6 +53,7 @@ shared_library("flutter_framework_dylib") {
deps = [
"//base:base",
"//dart/runtime:libdart",
"//flutter/flow",
"//flutter/glue",
"//flutter/lib/ui",
"//flutter/shell/common",
...
...
shell/platform/darwin/ios/framework/Source/FlutterView.mm
浏览文件 @
0a3c0b5e
...
...
@@ -3,6 +3,12 @@
// found in the LICENSE file.
#include "flutter/shell/platform/darwin/ios/framework/Source/FlutterView.h"
#include "flutter/common/threads.h"
#include "flutter/flow/layers/layer_tree.h"
#include "flutter/shell/common/rasterizer.h"
#include "flutter/shell/common/shell.h"
#include "lib/ftl/synchronization/waitable_event.h"
#include "third_party/skia/include/utils/mac/SkCGUtils.h"
@interface
FlutterView
()
<
UIInputViewAudioFeedback
>
...
...
@@ -30,4 +36,91 @@
return
YES
;
}
void
SnapshotRasterizer
(
ftl
::
WeakPtr
<
shell
::
Rasterizer
>
rasterizer
,
CGContextRef
context
,
bool
is_opaque
)
{
if
(
!
rasterizer
)
{
return
;
}
// Access the layer tree and assess the description of the backing store to
// create for this snapshot.
flow
::
LayerTree
*
layer_tree
=
rasterizer
->
GetLastLayerTree
();
if
(
layer_tree
==
nullptr
)
{
return
;
}
auto
size
=
layer_tree
->
frame_size
();
if
(
size
.
isEmpty
())
{
return
;
}
auto
info
=
SkImageInfo
::
MakeN32
(
size
.
width
(),
size
.
height
(),
is_opaque
?
SkAlphaType
:
:
kOpaque_SkAlphaType
:
SkAlphaType
::
kPremul_SkAlphaType
);
// Create the backing store and prepare for use.
SkBitmap
bitmap
;
bitmap
.
setInfo
(
info
);
if
(
!
bitmap
.
tryAllocPixels
())
{
return
;
}
// Create a canvas from the backing store and a single use compositor context
// to draw into the canvas.
SkAutoLockPixels
pixel_lock
(
bitmap
,
true
);
SkCanvas
canvas
(
bitmap
);
{
flow
::
CompositorContext
compositor_context
;
auto
frame
=
compositor_context
.
AcquireFrame
(
nullptr
,
&
canvas
,
false
/* instrumentation */
);
layer_tree
->
Raster
(
frame
,
false
/* ignore raster cache. */
);
}
canvas
.
flush
();
// Draw the bitmap to the system provided snapshotting context.
SkCGDrawBitmap
(
context
,
bitmap
,
0
,
0
);
}
void
SnapshotContents
(
CGContextRef
context
,
bool
is_opaque
)
{
// TODO(chinmaygarde): Currently, there is no way to get the rasterizer for
// a particular platform view from the shell. But, for now, we only have one
// platform view. So use that. Once we support multiple platform views, the
// shell will need to provide a way to get the rasterizer for a specific
// platform view.
std
::
vector
<
ftl
::
WeakPtr
<
shell
::
Rasterizer
>>
registered_rasterizers
;
shell
::
Shell
::
Shared
().
GetRasterizers
(
&
registered_rasterizers
);
for
(
auto
&
rasterizer
:
registered_rasterizers
)
{
SnapshotRasterizer
(
rasterizer
,
context
,
is_opaque
);
}
}
void
SnapshotContentsSync
(
CGContextRef
context
,
UIView
*
view
)
{
auto
gpu_thread
=
blink
::
Threads
::
Gpu
();
if
(
!
gpu_thread
)
{
return
;
}
ftl
::
AutoResetWaitableEvent
latch
;
gpu_thread
->
PostTask
([
&
latch
,
context
,
view
]()
{
SnapshotContents
(
context
,
[
view
isOpaque
]);
latch
.
Signal
();
});
latch
.
Wait
();
}
// Override the default CALayerDelegate method so that APIs that attempt to
// screenshot the view display contents correctly. We cannot depend on
// reading
// GPU pixels directly because:
// 1: We dont use retained backing on the CAEAGLLayer.
// 2: The call is made of the platform thread and not the GPU thread.
// 3: There may be a software rasterizer.
-
(
void
)
drawLayer
:(
CALayer
*
)
layer
inContext
:(
CGContextRef
)
context
{
SnapshotContentsSync
(
context
,
self
);
}
@end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录