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

📄 lsr_dec.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
	color->type = SVG_COLOR_RGBCOLOR;}static void lsr_read_line_increment_type(GF_LASeRCodec *lsr, SVG_Number *li, const char *name){	u32 val;	GF_LSR_READ_INT(lsr, val, 1, "choice");	if (val==1) {		GF_LSR_READ_INT(lsr, val, 1, "type");		if (val==1) li->type=SVG_NUMBER_INHERIT;		else li->type=SVG_NUMBER_AUTO;	} else {		li->value = lsr_read_fixed_16_8(lsr, "line-increment-value");	}}static void lsr_read_byte_align_string(GF_LASeRCodec *lsr, char **str, const char *name){	u32 len;	gf_bs_align(lsr->bs);	len = lsr_read_vluimsbf8(lsr, "len");	if (str) {		if (*str) free(*str);		*str = NULL;		if (len) {			if (len > gf_bs_available(lsr->bs) ) {				lsr->last_error = GF_NON_COMPLIANT_BITSTREAM;				return;			}			*str = (char*)malloc(sizeof(char)*(len+1));			gf_bs_read_data(lsr->bs, *str, len);			(*str) [len] = 0;		}	} else {		while (len) { gf_bs_read_int(lsr->bs, 8); len--; }	}	GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[LASeR] %s\t\t%d\t\t%s\n", name, 8*len, *str));}static void lsr_read_text_content(GF_LASeRCodec *lsr, GF_Node *elt){	char *str = NULL;	lsr_read_byte_align_string(lsr, &str, "textContent");	if (!str) return;	gf_dom_add_text_node(elt, str);}static void lsr_read_byte_align_string_list(GF_LASeRCodec *lsr, GF_List *l, const char *name, Bool is_iri){	XMLRI *iri;	char *text, *sep, *sep2, *cur;	while (gf_list_count(l)) {		char *str = (char *)gf_list_last(l);		gf_list_rem_last(l);		free(str);	}	text = NULL;	lsr_read_byte_align_string(lsr, &text, name);	cur = text;	while (cur) {		sep = strchr(cur, '\'');		if (!sep) {			if (is_iri) {				GF_SAFEALLOC(iri, XMLRI);				iri->string = strdup(cur);				iri->type = XMLRI_STRING;				gf_list_add(l, iri);			} else {				gf_list_add(l, strdup(cur));			}			break;		}		sep2 = strchr(sep + 1, '\'');		if (!sep2) {			if (is_iri) {				GF_SAFEALLOC(iri, XMLRI);				iri->string = strdup(cur);				iri->type = XMLRI_STRING;				gf_list_add(l, iri);			} else {				gf_list_add(l, strdup(cur));			}			break;		}		sep2[0] = 0;		if (is_iri) {			GF_SAFEALLOC(iri, XMLRI);			iri->string = strdup(sep+1);			iri->type = XMLRI_STRING;			gf_list_add(l, iri);		} else {			gf_list_add(l, strdup(sep+1));		}		sep2[0] = '\'';		cur = sep2 + 1;	}	free(text);}static void lsr_read_any_uri(GF_LASeRCodec *lsr, XMLRI *iri, const char *name){	u32 val;	GF_LSR_READ_INT(lsr, val, 1, "hasUri");	if (val) {		char *s = NULL;		iri->type=XMLRI_STRING;		if (iri->string) {			free(iri->string);			iri->string = NULL;		}		lsr_read_byte_align_string(lsr, &s, "uri");		GF_LSR_READ_INT(lsr, val, 1, "hasData");		if (!val) {			iri->string = s;		} else {			u32 len_rad, len;			len = lsr_read_vluimsbf5(lsr, "len");			len_rad = s ? strlen(s) : 0;			iri->string = (char*)malloc(sizeof(char)*(len_rad+1+len+1));			iri->string[0] = 0;			if (s) {				strcpy(iri->string, s);				free(s);			}			strcat(iri->string, ",");			gf_bs_read_data(lsr->bs, iri->string + len_rad + 1, len);			iri->string[len_rad + 1 + len] = 0;		}    }	GF_LSR_READ_INT(lsr, val, 1, "hasID");	if (val) lsr_read_codec_IDREF(lsr, iri, "idref");	GF_LSR_READ_INT(lsr, val, 1, "hasStreamID");	if (val) {		iri->type = XMLRI_STREAMID;		iri->lsr_stream_id = lsr_read_vluimsbf5(lsr, name);		GF_LSR_READ_INT(lsr, val, 1, "reserved");		if (val) {			u32 len = lsr_read_vluimsbf5(lsr, "len");			GF_LSR_READ_INT(lsr, val, len, "reserved");		}	}}static void lsr_read_paint(GF_LASeRCodec *lsr, SVG_Paint *paint, const char *name){	u32 val;	GF_LSR_READ_INT(lsr, val, 1, "hasIndex");	if (val) {		GF_LSR_READ_INT(lsr, val, lsr->colorIndexBits, name);		lsr_get_color(lsr, val, &paint->color);		paint->type = SVG_PAINT_COLOR;		paint->color.type = 0;	} else {		GF_LSR_READ_INT(lsr, val, 2, "enum");		switch (val) {		case 0:			GF_LSR_READ_INT(lsr, val, 2, "choice");			switch (val) {			case 0: paint->type = SVG_PAINT_INHERIT; break;			case 1: paint->type = SVG_PAINT_COLOR; paint->color.type = SVG_COLOR_CURRENTCOLOR; break;			default: paint->type = SVG_PAINT_NONE; break;			}			break;		case 1:		{			XMLRI iri;			memset(&iri, 0, sizeof(XMLRI));			iri.type = 0xFF;			lsr_read_any_uri(lsr, &iri, name);			gf_svg_unregister_iri(lsr->sg, &iri);			paint->type = SVG_PAINT_URI;			if (iri.string) {				paint->type = SVG_PAINT_URI;				paint->iri.type = XMLRI_STRING;				paint->iri.string = iri.string;			} else if (iri.target) {				paint->iri.type = XMLRI_ELEMENTID;				paint->iri.target = iri.target;			}		}			break;		case 2:		{			char *sysPaint=NULL;			lsr_read_byte_align_string(lsr, &sysPaint, "systemsPaint");			if (sysPaint) {				paint->type = SVG_PAINT_COLOR;				paint->color.type = gf_svg_get_system_paint_server_type(sysPaint);				free(sysPaint);			}		}			break;		case 3:			lsr_read_extension(lsr, name);			break;		}	}}static void lsr_read_string_attribute(GF_LASeRCodec *lsr, GF_Node *elt, u32 tag, char *name){	u32 val;	GF_LSR_READ_INT(lsr, val, 1, name);	if (val) {		GF_FieldInfo info;		lsr->last_error = gf_svg_get_attribute_by_tag(elt, tag, 1, 0, &info);		lsr_read_byte_align_string(lsr, info.far_ptr, name);	}}static void lsr_read_id(GF_LASeRCodec *lsr, GF_Node *n){	GF_FieldInfo info;	u32 val, id, i, count;	char *name;	GF_LSR_READ_INT(lsr, val, 1, "has_id");	if (!val) return;		name = NULL;    id = 1+lsr_read_vluimsbf5(lsr, "ID");	gf_node_set_id(n, id, name);	GF_LSR_READ_INT(lsr, val, 1, "reserved");	/*currently not used*/	if (val) {		u32 len = lsr_read_vluimsbf5(lsr, "len");		GF_LSR_READ_INT(lsr, val, len, "reserved");	}	/*update all pending HREFs*/	count = gf_list_count(lsr->defered_hrefs);	for (i=0; i<count; i++) {		XMLRI *href = (XMLRI *)gf_list_get(lsr->defered_hrefs, i);		char *str_id = href->string;		if (str_id[0] == '#') str_id++;		/*skip 'N'*/		str_id++;		if (id == (1 + (u32) atoi(str_id))) {			href->target = (SVG_Element*) n;			free(href->string);			href->string = NULL;			gf_list_rem(lsr->defered_hrefs, i);			i--;			count--;		}	}	/*update unresolved listeners*/	count = gf_list_count(lsr->defered_listeners);	for (i=0; i<count; i++) {		GF_Node *par;		XMLRI *observer = NULL;		GF_Node *listener = (GF_Node *)gf_list_get(lsr->defered_listeners, i);		par = NULL;		if (gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_observer, 0, 0, &info) == GF_OK) {			observer = (XMLRI*)info.far_ptr;			if (observer->type == XMLRI_ELEMENTID) {				if (!observer->target) continue;				else par = observer->target;			}		}		if (gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_listener_target, 0, 0, &info) == GF_OK) {			if (((XMLRI*)info.far_ptr)->type == XMLRI_ELEMENTID) {				if (!((XMLRI*)info.far_ptr)->target) continue;				else if (!par) par = ((XMLRI*)info.far_ptr)->target;			}		}		/*FIXME - double check with XML events*/		if (!par && !observer) {			if (gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_event, 0, 0, &info) == GF_OK) {				XMLEV_Event *ev = (XMLEV_Event *)info.far_ptr;				/*all non-UI get attched to root*/				if (ev && (ev->type>GF_EVENT_MOUSEWHEEL)) {					par = (GF_Node*) lsr->current_root;				} 			}		}		assert(par);		gf_dom_listener_add(par, listener);		gf_list_rem(lsr->defered_listeners, i);		i--;		count--;	}	/*update all pending animations*/	count = gf_list_count(lsr->defered_anims);	for (i=0; i<count; i++) {		SVG_Element *elt = (SVG_Element *)gf_list_get(lsr->defered_anims, i);		if (lsr_setup_smil_anim(lsr, elt, NULL)) {			gf_list_rem(lsr->defered_anims, i);			i--;			count--;			gf_node_init((GF_Node*)elt);		}	}}static Fixed lsr_translate_coords(GF_LASeRCodec *lsr, u32 val, u32 nb_bits){#ifdef GPAC_FIXED_POINT	if (val >> (nb_bits-1) ) {		s32 neg = (s32) val - (1<<nb_bits);		if (neg < -FIX_ONE / 2) 			return 2 * gf_divfix(INT2FIX(neg/2), lsr->res_factor);		return gf_divfix(INT2FIX(neg), lsr->res_factor);	} else {		if (val > FIX_ONE / 2) 			return 2 * gf_divfix(INT2FIX(val/2), lsr->res_factor);		return gf_divfix(INT2FIX(val), lsr->res_factor);	}#else	if (val >> (nb_bits-1) ) {		s32 neg = (s32) val - (1<<nb_bits);		return gf_divfix(INT2FIX(neg), lsr->res_factor);	} else {		return gf_divfix(INT2FIX(val), lsr->res_factor);	}#endif}static Fixed lsr_translate_scale(GF_LASeRCodec *lsr, u32 val){	if (val >> (lsr->coord_bits-1) ) {		s32 v = val - (1<<lsr->coord_bits);		return INT2FIX(v) / 256 ;	} else {		return INT2FIX(val) / 256;	}}static void lsr_read_matrix(GF_LASeRCodec *lsr, SVG_Transform *mx){	u32 flag;	gf_mx2d_init(mx->mat);	mx->is_ref = 0;	GF_LSR_READ_INT(lsr, flag, 1, "isNotMatrix");	if (flag) {		GF_LSR_READ_INT(lsr, flag, 1, "isRef");		if (flag) {			GF_LSR_READ_INT(lsr, flag, 1, "hasXY");			if (flag) {				mx->mat.m[2] = lsr_read_fixed_16_8(lsr, "valueX");				mx->mat.m[5] = lsr_read_fixed_16_8(lsr, "valueY");			}		} else {			lsr_read_extension(lsr, "ext");		}	} else {		lsr->coord_bits += lsr->scale_bits;		GF_LSR_READ_INT(lsr, flag, 1, "xx_yy_present");		if (flag) {			GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "xx");			mx->mat.m[0] = lsr_translate_scale(lsr, flag);			GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "yy");			mx->mat.m[4] = lsr_translate_scale(lsr, flag);		} else {			mx->mat.m[0] = mx->mat.m[4] = FIX_ONE;		}		GF_LSR_READ_INT(lsr, flag, 1, "xy_yx_present");		if (flag) {			GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "xy");			mx->mat.m[1] = lsr_translate_scale(lsr, flag);			GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "yx");			mx->mat.m[3] = lsr_translate_scale(lsr, flag);		}		lsr->coord_bits -= lsr->scale_bits;		GF_LSR_READ_INT(lsr, flag, 1, "xz_yz_present");		if (flag) {			GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "xz");			mx->mat.m[2] = lsr_translate_coords(lsr, flag, lsr->coord_bits);			GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "yz");			mx->mat.m[5] = lsr_translate_coords(lsr, flag, lsr->coord_bits);		}	}}static Fixed lsr_read_fixed_clamp(GF_LASeRCodec *lsr, const char *name){	s32 val;	GF_LSR_READ_INT(lsr, val, 8, name);	return INT2FIX(val) / 255;}static void lsr_read_focus(GF_LASeRCodec *lsr, SVG_Focus *foc, const char *name){	u32 flag;		if (foc->target.string) {		free(foc->target.string);		foc->target.string = NULL;	}	if (foc->target.target) foc->target.target = NULL;	gf_svg_unregister_iri(lsr->sg, &foc->target);	GF_LSR_READ_INT(lsr, flag, 1, "isEnum");	if (flag) {		GF_LSR_READ_INT(lsr, foc->type, 1, "enum");	} else {		foc->type = SVG_FOCUS_IRI;		lsr_read_codec_IDREF(lsr, &foc->target, "id");	}}static void lsr_restore_base(GF_LASeRCodec *lsr, SVG_Element *elt, SVG_Element *base, Bool reset_fill, Bool reset_stroke){	GF_Err e;	GF_FieldInfo f_base, f_clone;	SVGAttribute *att;	/*clone all propertie from base*/	att = base->attributes;	while (att) {		Bool is_fill, is_stroke;		is_fill = is_stroke = 0;		switch (att->tag) {		/*for all properties*/		case TAG_SVG_ATT_fill:			is_fill = 1;			break;		case TAG_SVG_ATT_stroke: 			is_stroke = 1;			break;		case TAG_SVG_ATT_audio_level: 		case TAG_SVG_ATT_color: 		case TAG_SVG_ATT_color_rendering: 		case TAG_SVG_ATT_display: 		case TAG_SVG_ATT_display_align: 		case TAG_SVG_ATT_fill_opacity: 		case TAG_SVG_ATT_fill_rule: 		case TAG_SVG_ATT_font_family: 		case TAG_SVG_ATT_font_size: 		case TAG_SVG_ATT_font_style: 		case TAG_SVG_ATT_font_variant: 		case TAG_SVG_ATT_font_weight: 		case TAG_SVG_ATT_image_rendering: 		case TAG_SVG_ATT_line_increment: 		case TAG_SVG_ATT_opacity: 		case TAG_SVG_ATT_pointer_events: 		case TAG_SVG_ATT_shape_rendering: 		case TAG_SVG_ATT_solid_color: 		case TAG_SVG_ATT_solid_opacity: 		case TAG_SVG_ATT_stop_color: 		case TAG_SVG_ATT_stop_opacity: 		case TAG_SVG_ATT_stroke_dasharray: 		case TAG_SVG_ATT_stroke_dashoffset: 		case TAG_SVG_ATT_stroke_linecap: 		case TAG_SVG_ATT_stroke_linejoin: 		case TAG_SVG_ATT_stroke_miterlimit: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -