Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sxychenjing
engine
提交
6693dd75
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,发现更多精彩内容 >>
未验证
提交
6693dd75
编写于
1月 16, 2020
作者:
H
Harry Terkelsen
提交者:
GitHub
1月 16, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support animated images in the CanvasKit backend (#15678)
上级
c7d0fb78
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
70 addition
and
12 deletion
+70
-12
lib/web_ui/lib/src/engine/compositor/image.dart
lib/web_ui/lib/src/engine/compositor/image.dart
+70
-12
未找到文件。
lib/web_ui/lib/src/engine/compositor/image.dart
浏览文件 @
6693dd75
...
...
@@ -7,13 +7,53 @@ part of engine;
/// Instantiates a [ui.Codec] backed by an `SkImage` from Skia.
void
skiaInstantiateImageCodec
(
Uint8List
list
,
Callback
<
ui
.
Codec
>
callback
,
[
int
width
,
int
height
,
int
format
,
int
rowBytes
])
{
final
js
.
JsObject
skImage
=
canvasKit
.
callMethod
(
'MakeImageFromEncoded'
,
<
Uint8List
>[
list
]);
final
Sk
Image
image
=
SkImage
(
sk
Image
);
final
Sk
ImageCodec
codec
=
SkImageCodec
(
i
mage
);
final
js
.
JsObject
sk
Animated
Image
=
canvasKit
.
callMethod
(
'Make
Animated
ImageFromEncoded'
,
<
Uint8List
>[
list
]);
final
Sk
AnimatedImage
animatedImage
=
SkAnimatedImage
(
skAnimated
Image
);
final
Sk
AnimatedImageCodec
codec
=
SkAnimatedImageCodec
(
animatedI
mage
);
callback
(
codec
);
}
/// A wrapper for `SkAnimatedImage`.
class
SkAnimatedImage
implements
ui
.
Image
{
final
js
.
JsObject
_skAnimatedImage
;
SkAnimatedImage
(
this
.
_skAnimatedImage
);
@override
void
dispose
()
{
_skAnimatedImage
.
callMethod
(
'delete'
);
}
int
get
frameCount
=>
_skAnimatedImage
.
callMethod
(
'getFrameCount'
);
/// Decodes the next frame and returns the frame duration.
Duration
decodeNextFrame
()
{
final
int
durationMillis
=
_skAnimatedImage
.
callMethod
(
'decodeNextFrame'
);
return
Duration
(
milliseconds:
durationMillis
);
}
int
get
repetitionCount
=>
_skAnimatedImage
.
callMethod
(
'getRepetitionCount'
);
SkImage
get
currentFrameAsImage
{
final
js
.
JsObject
_currentFrame
=
_skAnimatedImage
.
callMethod
(
'getCurrentFrame'
);
return
SkImage
(
_currentFrame
);
}
@override
int
get
width
=>
_skAnimatedImage
.
callMethod
(
'width'
);
@override
int
get
height
=>
_skAnimatedImage
.
callMethod
(
'height'
);
@override
Future
<
ByteData
>
toByteData
(
{
ui
.
ImageByteFormat
format
=
ui
.
ImageByteFormat
.
rawRgba
})
{
throw
'unimplemented'
;
}
}
/// A [ui.Image] backed by an `SkImage` from Skia.
class
SkImage
implements
ui
.
Image
{
js
.
JsObject
skImage
;
...
...
@@ -22,6 +62,7 @@ class SkImage implements ui.Image {
@override
void
dispose
()
{
skImage
.
callMethod
(
'delete'
);
skImage
=
null
;
}
...
...
@@ -38,25 +79,42 @@ class SkImage implements ui.Image {
}
}
/// A [
ui.Codec] backed by an `SkImage` from Skia
.
class
SkImageCodec
implements
ui
.
Codec
{
final
SkImage
sk
Image
;
/// A [
Codec] that wraps an `SkAnimatedImage`
.
class
Sk
Animated
ImageCodec
implements
ui
.
Codec
{
SkAnimatedImage
animated
Image
;
Sk
ImageCodec
(
this
.
sk
Image
);
Sk
AnimatedImageCodec
(
this
.
animated
Image
);
@override
void
dispose
()
{
// TODO: implement dispose
animatedImage
.
dispose
();
animatedImage
=
null
;
}
@override
int
get
frameCount
=>
1
;
int
get
frameCount
=>
animatedImage
.
frameCount
;
@override
int
get
repetitionCount
=>
animatedImage
.
repetitionCount
;
@override
Future
<
ui
.
FrameInfo
>
getNextFrame
()
{
return
Future
<
ui
.
FrameInfo
>.
value
(
SingleFrameInfo
(
skImage
));
final
Duration
duration
=
animatedImage
.
decodeNextFrame
();
final
SkImage
image
=
animatedImage
.
currentFrameAsImage
;
return
Future
<
ui
.
FrameInfo
>.
value
(
AnimatedImageFrameInfo
(
duration
,
image
));
}
}
/// Data for a single frame of an animated image.
class
AnimatedImageFrameInfo
implements
ui
.
FrameInfo
{
final
Duration
_duration
;
final
SkImage
_image
;
AnimatedImageFrameInfo
(
this
.
_duration
,
this
.
_image
);
@override
Duration
get
duration
=>
_duration
;
@override
int
get
repetitionCount
=>
0
;
ui
.
Image
get
image
=>
_image
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录