📄 lsr_dec.c
字号:
not_res = 0; if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_begin, 0, 0, &info)==GF_OK) { if (!lsr_init_smil_times(lsr, anim, *(GF_List**)info.far_ptr, anim_parent)) not_res++; } if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_end, 0, 0, &info)==GF_OK) { if (!lsr_init_smil_times(lsr, anim, *(GF_List**)info.far_ptr, anim_parent)) not_res++; } /*get xlink*/ xlink = NULL; if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_xlink_href, 0, 0, &info)==GF_OK) { xlink = info.far_ptr; } /*setup target node*/ if (!xlink || !xlink->target) { /*target not received*/ if (xlink && (xlink->type == XMLRI_ELEMENTID)) return 0; if (!xlink) { /*target is parent, initialize xlink (needed by anim module)*/ if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_xlink_href, 1, 0, &info)==GF_OK) { xlink = info.far_ptr; } else { return 0; } } xlink->type = XMLRI_ELEMENTID; xlink->target = anim_parent; gf_svg_register_iri(lsr->sg, xlink); target = (GF_Node *)anim_parent; } else { target = (GF_Node *)xlink->target; } if (!target || not_res) return 0; is_animateTransform = is_animateMotion = 0; if (anim->sgprivate->tag==TAG_SVG_animateMotion) is_animateMotion = 1; else if (anim->sgprivate->tag==TAG_SVG_animateTransform) { is_animateTransform = 1; } if (is_animateMotion) goto translate_vals; /*for all except animateMotion, get attributeName*/ if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_attributeName, 0, 0, &info)==GF_OK) { name = info.far_ptr; } if (!name) return 0; if (!name->field_ptr) { if (gf_svg_get_attribute_by_tag((GF_Node *)target, name->type, 1, 0, &info)!=GF_OK) return 0; name->field_ptr = info.far_ptr; name->type = info.fieldType; name->tag = info.fieldIndex; } /*browse all anim types and retranslate anim values. This must be done in 2 steps since we may not have received the target node when parsing the animation node*/translate_vals: /*and setup anim values*/ if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_from, 0, 0, &info)==GF_OK) { if (is_animateTransform) { name->type = ((SMIL_AnimateValue*)info.far_ptr)->type; } else { value = info.far_ptr; coded_type = value->type; value->type = is_animateMotion ? SVG_Motion_datatype : name->type; lsr_translate_anim_value(value, coded_type); } } if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_by, 0, 0, &info)==GF_OK) { if (is_animateTransform) { name->type = ((SMIL_AnimateValue*)info.far_ptr)->type; } else { value = info.far_ptr; coded_type = value->type; value->type = is_animateMotion ? SVG_Motion_datatype : name->type; lsr_translate_anim_value(value, coded_type); } } if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_to, 0, 0, &info)==GF_OK) { if (is_animateTransform) { name->type = ((SMIL_AnimateValue*)info.far_ptr)->type; } else { value = info.far_ptr; coded_type = value->type; value->type = is_animateMotion ? SVG_Motion_datatype : name->type; lsr_translate_anim_value(value, coded_type); } } if (gf_svg_get_attribute_by_tag((GF_Node *)anim, TAG_SVG_ATT_values, 0, 0, &info)==GF_OK) { if (is_animateTransform) { name->type = ((SMIL_AnimateValues*)info.far_ptr)->type; } else { SMIL_AnimateValues *values = info.far_ptr; coded_type = values->type; values->type = is_animateMotion ? SVG_Motion_datatype : name->type; lsr_translate_anim_values(values, coded_type); } } return 1;}static void lsr_read_anim_fill(GF_LASeRCodec *lsr, GF_Node *n){ u32 val; GF_LSR_READ_INT(lsr, val, 1, "has_smil_fill"); if (val) { GF_FieldInfo info; lsr->last_error = gf_svg_get_attribute_by_tag(n, TAG_SVG_ATT_smil_fill, 1, 0, &info); /*enumeration freeze{0} remove{1}*/ GF_LSR_READ_INT(lsr, val, 1, "smil_fill"); *(SMIL_Fill*)info.far_ptr = val ? SMIL_FILL_REMOVE : SMIL_FILL_FREEZE; }}static void lsr_read_anim_repeatCount(GF_LASeRCodec *lsr, GF_Node *n){ u32 val; GF_LSR_READ_INT(lsr, val, 1, "has_repeatCount"); if (val) { GF_FieldInfo info; lsr->last_error = gf_svg_get_attribute_by_tag(n, TAG_SVG_ATT_repeatCount, 1, 0, &info); GF_LSR_READ_INT(lsr, val, 1, "repeatCount"); if (val) ((SMIL_RepeatCount*)info.far_ptr)->type = SMIL_REPEATCOUNT_INDEFINITE; else { ((SMIL_RepeatCount*)info.far_ptr)->type = SMIL_REPEATCOUNT_DEFINED; ((SMIL_RepeatCount*)info.far_ptr)->count = lsr_read_fixed_16_8(lsr, "repeatCount"); } }}static void lsr_read_repeat_duration(GF_LASeRCodec *lsr, GF_Node *n){ u32 flag; GF_LSR_READ_INT(lsr, flag, 1, "has_repeatDur"); if (flag) { GF_FieldInfo info; lsr->last_error = gf_svg_get_attribute_by_tag(n, TAG_SVG_ATT_repeatDur, 1, 0, &info); GF_LSR_READ_INT(lsr, flag, 1, "choice"); if (flag) { ((SMIL_Duration *)info.far_ptr)->type = SMIL_DURATION_INDEFINITE; } else { ((SMIL_Duration *)info.far_ptr)->clock_value = (Double) lsr_read_vluimsbf5(lsr, "value"); ((SMIL_Duration *)info.far_ptr)->clock_value /= lsr->time_resolution; ((SMIL_Duration *)info.far_ptr)->type = SMIL_DURATION_DEFINED; } }}static void lsr_read_anim_restart(GF_LASeRCodec *lsr, GF_Node *n){ u32 val; GF_LSR_READ_INT(lsr, val, 1, "has_restart"); if (val) { GF_FieldInfo info; lsr->last_error = gf_svg_get_attribute_by_tag(n, TAG_SVG_ATT_restart, 1, 0, &info); /*enumeration always{0} never{1} whenNotActive{2}*/ GF_LSR_READ_INT(lsr, *(SMIL_Restart*)info.far_ptr, 2, "restart"); }}static void *lsr_read_an_anim_value(GF_LASeRCodec *lsr, u32 coded_type, const char *name){ u32 flag; u32 escapeFlag, escape_val = 0; u8 *enum_val; u32 *id_val; char *string; SVG_Number *num; XMLRI *iri; SVG_Point *pt; SVG_Paint *paint; GF_LSR_READ_INT(lsr, escapeFlag, 1, "escapeFlag"); if (escapeFlag) GF_LSR_READ_INT(lsr, escape_val, 2, "escapeEnum"); switch (coded_type) { case 0: string = NULL; lsr_read_byte_align_string(lsr, &string, name); return string; case 1: num = (SVG_Number*)malloc(sizeof(SVG_Number)); if (escapeFlag) { num->type = escape_val; } else { num->type = SVG_NUMBER_VALUE; num->value = lsr_read_fixed_16_8(lsr, name); } return num; case 2: { SVG_PathData *pd = (SVG_PathData *)gf_svg_create_attribute_value(SVG_PathData_datatype); lsr_read_path_type(lsr, NULL, 0, pd, name); return pd; } case 3: { SVG_Points *pts = (SVG_Points *)gf_svg_create_attribute_value(SVG_Points_datatype); lsr_read_point_sequence(lsr, *pts, name); return pts; } case 4: num = (SVG_Number*)malloc(sizeof(SVG_Number)); if (escapeFlag) { num->type = escape_val; } else { num->type = SVG_NUMBER_VALUE; num->value = lsr_read_fixed_clamp(lsr, name); } return num; case 5: GF_SAFEALLOC(paint, SVG_Paint); if (escapeFlag) { paint->type = SVG_PAINT_INHERIT; } else { lsr_read_paint(lsr, paint, name); } return paint; case 6: enum_val = (u8*)malloc(sizeof(u8)); *enum_val = lsr_read_vluimsbf5(lsr, name); return enum_val; /*TODO check this is correct*/ case 7: { GF_List *l = gf_list_new(); u32 i, count; count = lsr_read_vluimsbf5(lsr, "count"); for (i=0; i<count; i++) { u8 *v = (u8 *)malloc(sizeof(u8)); *v = lsr_read_vluimsbf5(lsr, "val"); gf_list_add(l, v); } return l; } /*TODO check this is correct*/ case 8: // floats { GF_List *l = gf_list_new(); u32 i, count; count = lsr_read_vluimsbf5(lsr, "count"); for (i=0; i<count; i++) { Fixed *v = (Fixed *)malloc(sizeof(Fixed)); *v = lsr_read_fixed_16_8(lsr, "val"); gf_list_add(l, v); } return l; } /*point */ case 9: pt = (SVG_Point*)malloc(sizeof(SVG_Point)); GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "valX"); pt->x = lsr_translate_coords(lsr, flag, lsr->coord_bits); GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "valY"); pt->y = lsr_translate_coords(lsr, flag, lsr->coord_bits); return pt; case 10: id_val = (u32*)malloc(sizeof(u32)); *id_val = lsr_read_vluimsbf5(lsr, name); return id_val; case 11: { SVG_FontFamily *ft; u32 idx; GF_SAFEALLOC(ft, SVG_FontFamily); if (escapeFlag) { ft->type = SVG_FONTFAMILY_INHERIT; } else { idx = lsr_read_vluimsbf5(lsr, name); ft->type = SVG_FONTFAMILY_VALUE; ft->value = (char*)gf_list_get(lsr->font_table, idx); if (ft->value) ft->value = strdup(ft->value); } return ft; } case 12: GF_SAFEALLOC(iri, XMLRI); lsr_read_any_uri(lsr, iri, name); return iri; default: lsr_read_extension(lsr, name); break; } return NULL;}static void lsr_translate_anim_trans_value(SMIL_AnimateValue *val, u32 transform_type){ SVG_Point_Angle *p; Fixed *f; u32 coded_type = val->type; switch(transform_type) { case SVG_TRANSFORM_TRANSLATE: val->type = SVG_Transform_Translate_datatype; break; case SVG_TRANSFORM_SCALE: val->type = SVG_Transform_Scale_datatype; break; case SVG_TRANSFORM_ROTATE: val->type = SVG_Transform_Rotate_datatype; break; case SVG_TRANSFORM_SKEWX: val->type = SVG_Transform_SkewX_datatype; break; case SVG_TRANSFORM_SKEWY: val->type = SVG_Transform_SkewY_datatype; break; case SVG_TRANSFORM_MATRIX: val->type = SVG_Transform_datatype; break; default: GF_LOG(GF_LOG_ERROR, GF_LOG_PARSER, ("[LSR Parsing] unknown datatype for animate transform.\n")); return; } if (!val->value) return; switch (transform_type) { case SVG_TRANSFORM_ROTATE: p = (SVG_Point_Angle*)malloc(sizeof(SVG_Point_Angle)); p->x = p->y = 0; if (coded_type==8) { GF_List *l = (GF_List *)val->value; f = (Fixed*)gf_list_get(l, 0); if (f) { p->angle = *f; free(f); } f = (Fixed*)gf_list_get(l, 1); if (f) { p->x = *f; free(f); } f = (Fixed*)gf_list_get(l, 2); if (f) { p->y = *f; free(f); } gf_list_del(l); } else { p->angle = ((SVG_Number *)val->value)->value; free(val->value); } p->angle = gf_muldiv(p->angle, GF_PI, INT2FIX(180) ); val->value = p; break; case SVG_TRANSFORM_SCALE: if (coded_type==8) { SVG_Point *pt; GF_List *l = (GF_List *)val->value; GF_SAFEALLOC(pt , SVG_Point); f = (Fixed*)gf_list_get(l, 0); if (f) { pt->x = *f; free(f); } f = (Fixed*)gf_list_get(l, 1); if (f) { pt->y = *f; free(f); } else pt->y = pt->x; gf_list_del(l); val->value = pt; } break; case SVG_TRANSFORM_SKEWX: case SVG_TRANSFORM_SKEWY: f = (Fixed*)malloc(sizeof(Fixed)); *f = ((SVG_Number *)val->value)->value; free(val->value); val->value = f; break; }}static void lsr_translate_anim_trans_values(SMIL_AnimateValues *val, u32 transform_type){ u32 count, i, coded_type; SVG_Point_Angle *p; SVG_Point *pt; Fixed *f; GF_List *l; coded_type = val->type; switch(transform_type) { case SVG_TRANSFORM_TRANSLATE: val->type = SVG_Transform_Translate_datatype; break; case SVG_TRANSFORM_SCALE: val->type = SVG_Transform_Scale_datatype; break; case SVG_TRANSFORM_ROTATE: val->type = SVG_Transform_Rotate_datatype; break; case SVG_TRANSFORM_SKEWX: val->type = SVG_Transform_SkewX_datatype; break; case SVG_TRANSFORM_SKEWY: val->type = SVG_Transform_SkewY_datatype; break; case SVG_TRANSFORM_MATRIX: val->type = SVG_Transform_datatype; break; default: GF_LOG(GF_LOG_ERROR, GF_LOG_PARSER, ("[SVG Parsing] unknown datatype for animate transform.\n")); return; } count = gf_list_count(val->values); if (!count) return; if (transform_type==SVG_TRANSFORM_TRANSLATE) return; for (i=0;i<count; i++) { void *a_val = gf_list_get(val->values, i); switch (transform_type) { case SVG_TRANSFORM_ROTATE: GF_SAFEALLOC(p, SVG_Point_Angle); if (coded_type==8) { l = (GF_List*)a_val; f = (Fixed*)gf_list_get(l, 0); p->angle = *f; f = (Fixed*)gf_list_get(l, 1); if (f) p->x = *f; f = (Fixed*)gf_list_get(l, 2); if (f) p->y = *f; while (gf_list_count(l)) { f = (Fixed*)gf_list_last(l); gf_list_rem_last(l); free(f); } gf_list_del(l); } else if (coded_type==1) { p->angle = ((SVG_Number *)a_val)->value; free(a_val); } p->angle = gf_muldiv(p->angle, GF_PI, INT2FIX(180) ); gf_list_rem(val->values, i); gf_list_insert(val->values, p, i); break; case SVG_TRANSFORM_SKEWX: case SVG_TRANSFORM_SKEWY: f = (Fixed*)malloc(sizeof(Fixed)); *f = ((SVG_Number *)a_val)->value; free(a_val); gf_list_rem(val->values, i); gf_list_insert(val->values, f, i); break; case SVG_TRANSFORM_SCALE: pt = (SVG_Point*)malloc(sizeof(SVG_Point)); l = (GF_List*)a_val; f = (Fixed*)gf_list_get(l, 0); if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -