Skip to content

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)