Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fa2cef9

Browse files
author
mayintao3
committed
feat: 添加keyframse的flatbuffer解析
1 parent 7f9b911 commit fa2cef9

File tree

4 files changed

+418
-16
lines changed

4 files changed

+418
-16
lines changed

‎flatbuffers/stylesheet.fbs‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,19 @@ table Font {
101101
src: string;
102102
}
103103

104+
// 关键帧动画点,每个点包含百分比和样式声明
105+
table KeyframeAnimationPoint {
106+
percentage:float;
107+
declarations:[DeclarationTuple];
108+
}
109+
110+
// 关键帧动画,包含名称、媒体ID和一系列动画点
111+
table KeyframeAnimation {
112+
name:string;
113+
media:uint8;
114+
keyframe_points:[KeyframeAnimationPoint];
115+
}
116+
104117
table PrimitiveCondition {
105118
feature:uint8;
106119
operator:uint8;
@@ -128,7 +141,7 @@ table Media {
128141

129142
table StyleSheet {
130143
fonts:[Font];
131-
keyframes:[string];
144+
keyframes:[KeyframeAnimation];
132145
medias:[Media];
133146
styles:[Style];
134147
design_width:uint16;

‎src/lib.rs‎

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ mod tests {
120120
assert_eq!(style_sheet.fonts().unwrap().len(), 0);
121121

122122
// 验证 keyframes
123-
// assert_eq!(style_sheet.keyframes().unwrap().len(), 0);
123+
assert_eq!(style_sheet.keyframes().unwrap().len(), 0);
124124

125125
// 验证 medias
126126
assert_eq!(style_sheet.medias().unwrap().len(), 0);
@@ -202,4 +202,92 @@ mod tests {
202202
assert_eq!(third_pseudo_key.is_int(), false);
203203
assert_eq!(sixth_style.pseudo_val().unwrap(), "2n");
204204
}
205+
206+
#[test]
207+
fn test_keyframes() {
208+
// 创建一个包含keyframes的JSON测试用例
209+
let json_input = json!({
210+
"fonts": [],
211+
"keyframes": [
212+
{"name": "fadeIn", "media": 0, "keyframe": [
213+
{"percent": 0, "event": [[42, 4278190080u32]]}, // 开始是黑色
214+
{"percent": 100, "event": [[42, 4294967295u32]]} // 结束是白色
215+
]},
216+
{"name": "spin", "media": 0, "keyframe": [
217+
{"percent": 0, "event": [[22, 0]]}, // 旋转0度
218+
{"percent": 50, "event": [[22, 180]]}, // 旋转180度
219+
{"percent": 100, "event": [[22, 360]]} // 旋转360度
220+
]}
221+
],
222+
"medias": [],
223+
"styles": []
224+
}).to_string();
225+
226+
let result = convert_json_to_flatbuffer(&json_input);
227+
assert!(result.is_ok());
228+
229+
let buffer = result.unwrap();
230+
let style_sheet = styles::root_as_style_sheet(&buffer).unwrap();
231+
232+
// 验证 keyframes
233+
let keyframes = style_sheet.keyframes().unwrap();
234+
assert_eq!(keyframes.len(), 2); // 应该有两个关键帧动画
235+
236+
// 验证第一个keyframe
237+
let first_keyframe = keyframes.get(0);
238+
assert_eq!(first_keyframe.name().unwrap(), "fadeIn");
239+
assert_eq!(first_keyframe.media(), 0);
240+
241+
// 验证第一个keyframe的关键帧点
242+
let first_keyframe_points = first_keyframe.keyframe_points().unwrap();
243+
assert_eq!(first_keyframe_points.len(), 2);
244+
245+
// 验证第一个关键帧点 (0%)
246+
let point0 = first_keyframe_points.get(0);
247+
assert_eq!(point0.percentage(), 0.0);
248+
let declarations0 = point0.declarations().unwrap();
249+
assert_eq!(declarations0.len(), 1);
250+
let decl0 = declarations0.get(0);
251+
assert_eq!(decl0.property_id(), 42); // 颜色属性
252+
assert_eq!(decl0.value_as_integer().unwrap().value(), 4278190080);
253+
254+
// 验证第二个关键帧点 (100%)
255+
let point100 = first_keyframe_points.get(1);
256+
assert_eq!(point100.percentage(), 100.0);
257+
let declarations100 = point100.declarations().unwrap();
258+
assert_eq!(declarations100.len(), 1);
259+
let decl100 = declarations100.get(0);
260+
assert_eq!(decl100.property_id(), 42);
261+
assert_eq!(decl100.value_as_integer().unwrap().value(), 4294967295);
262+
263+
// 验证第二个keyframe
264+
let second_keyframe = keyframes.get(1);
265+
assert_eq!(second_keyframe.name().unwrap(), "spin");
266+
assert_eq!(second_keyframe.media(), 0);
267+
268+
// 验证第二个keyframe的关键帧点
269+
let second_keyframe_points = second_keyframe.keyframe_points().unwrap();
270+
assert_eq!(second_keyframe_points.len(), 3);
271+
272+
// 验证第一个关键帧点 (0%)
273+
let point0 = second_keyframe_points.get(0);
274+
assert_eq!(point0.percentage(), 0.0);
275+
let declarations0 = point0.declarations().unwrap();
276+
assert_eq!(declarations0.get(0).property_id(), 22);
277+
assert_eq!(declarations0.get(0).value_as_integer().unwrap().value(), 0);
278+
279+
// 验证第二个关键帧点 (50%)
280+
let point50 = second_keyframe_points.get(1);
281+
assert_eq!(point50.percentage(), 50.0);
282+
let declarations50 = point50.declarations().unwrap();
283+
assert_eq!(declarations50.get(0).property_id(), 22);
284+
assert_eq!(declarations50.get(0).value_as_integer().unwrap().value(), 180);
285+
286+
// 验证第三个关键帧点 (100%)
287+
let point100 = second_keyframe_points.get(2);
288+
assert_eq!(point100.percentage(), 100.0);
289+
let declarations100 = point100.declarations().unwrap();
290+
assert_eq!(declarations100.get(0).property_id(), 22);
291+
assert_eq!(declarations100.get(0).value_as_integer().unwrap().value(), 360);
292+
}
205293
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /