⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsr_dec.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -