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

📄 lsr_enc.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		lsr_write_vluimsbf5(lsr, count, "count");        for (i=0; i<count; i++) {			u8 *v = (u8 *)gf_list_get(l, i);			lsr_write_vluimsbf5(lsr, *v, "val");        }	}        break;    case 8: // floats	{		u32 i, count;		if (svg_type==SVG_StrokeDashArray_datatype) {			SVG_StrokeDashArray *da = (SVG_StrokeDashArray *)val;			lsr_write_vluimsbf5(lsr, da->array.count, "count");			for (i=0; i<da->array.count; i++) {				lsr_write_fixed_16_8(lsr, da->array.vals[i], "val");			}		} else if (svg_type==SVG_ViewBox_datatype) {			SVG_ViewBox *vb = (SVG_ViewBox *)val;			lsr_write_vluimsbf5(lsr, 4, "count");			lsr_write_fixed_16_8(lsr, vb->x, "val");			lsr_write_fixed_16_8(lsr, vb->y, "val");			lsr_write_fixed_16_8(lsr, vb->width, "val");			lsr_write_fixed_16_8(lsr, vb->height, "val");		} else if (svg_type==SVG_Coordinates_datatype) {			GF_List *l = *(GF_List **)val;			count = gf_list_count(l);			lsr_write_vluimsbf5(lsr, count, "count");			for (i=0; i<count; i++) {				SVG_Coordinate *v = (SVG_Coordinate *)gf_list_get(l, i);				lsr_write_fixed_16_8(lsr, v->value, "val");			}		} else if (svg_type==SVG_Transform_Rotate_datatype) {			Fixed angle;			SVG_Point_Angle *p = (SVG_Point_Angle *)val;			count = (p->x || p->y) ? 3 : 1;			lsr_write_vluimsbf5(lsr, count, "count");			angle = gf_muldiv(p->angle, INT2FIX(180), GF_PI);			lsr_write_fixed_16_8(lsr, p->angle, "val");			if (count==3) {				lsr_write_fixed_16_8(lsr, p->x, "val");				lsr_write_fixed_16_8(lsr, p->y, "val");			}		} else if (svg_type==SVG_Transform_Scale_datatype) {			SVG_Point *pt = (SVG_Point *)val;			count = (pt->x == pt->y) ? 1 : 2;			lsr_write_vluimsbf5(lsr, count, "count");			lsr_write_fixed_16_8(lsr, pt->x, "val");			if (count==2) lsr_write_fixed_16_8(lsr, pt->y, "val");		} else {			GF_List *l = *(GF_List **)val;			count = gf_list_count(l);			lsr_write_vluimsbf5(lsr, count, "count");			for (i=0; i<count; i++) {				Fixed *v = (Fixed *)gf_list_get(l, i);				lsr_write_fixed_16_8(lsr, *v, "val");			}		}	}        break;    case 9: // point		if (svg_type==SVG_Motion_datatype) {			lsr_write_coordinate(lsr, ((GF_Matrix2D*)val)->m[2], 0, "valX");			lsr_write_coordinate(lsr, ((GF_Matrix2D*)val)->m[5], 0, "valY");		} else {			lsr_write_coordinate(lsr, ((SVG_Point *)val)->x, 0, "valX");			lsr_write_coordinate(lsr, ((SVG_Point *)val)->y, 0, "valY");		}        break;    default:		lsr_write_extension(lsr, NULL, 0, name);        break;    }}static void lsr_write_anim_value(GF_LASeRCodec *lsr, SMIL_AnimateValue *val, const char *name){	if (!val || !val->type) {		GF_LSR_WRITE_INT(lsr, 0, 1, name);	} else {		u32 type = svg_type_to_lsr_anim(val->type, 0, NULL, val->value);		if (type==255) {			GF_LOG(GF_LOG_WARNING, GF_LOG_CODING, ("[LASeR] unsupported anim type %d - skipping\n", val->type ));			GF_LSR_WRITE_INT(lsr, 0, 1, name);		} else {			GF_LSR_WRITE_INT(lsr, 1, 1, name);			GF_LSR_WRITE_INT(lsr, type, 4, "type");			lsr_write_an_anim_value(lsr, val->value, type, val->type, 0, name);		}	}}static void lsr_write_anim_values(GF_LASeRCodec *lsr, SMIL_AnimateValues *anims, const char *name){	u32 type, i, count = 0;	if (anims && anims->type) count = gf_list_count(anims->values);	if (!count) {		GF_LSR_WRITE_INT(lsr, 0, 1, name);		return;	}	type = svg_type_to_lsr_anim(anims->type, 0, anims->values, NULL);	if (type==255) {		GF_LOG(GF_LOG_WARNING, GF_LOG_CODING, ("[LASeR] unsupported anim type %d - skipping\n", anims->type ));		GF_LSR_WRITE_INT(lsr, 0, 1, name);	} else {		GF_LSR_WRITE_INT(lsr, 1, 1, name);		GF_LSR_WRITE_INT(lsr, type, 4, "type");		lsr_write_vluimsbf5(lsr, count, "count");		for (i=0; i<count; i++) {			void *att = gf_list_get(anims->values, i);			lsr_write_an_anim_value(lsr, att, type, anims->type, 0, "a_value");		}	}}static void lsr_write_fraction_12(GF_LASeRCodec *lsr, GF_List **l, const char *name){	u32 i, count;	count = l ? gf_list_count(*l) : 0;	if (!count) {		GF_LSR_WRITE_INT(lsr, 0, 1, name);		return;	}	GF_LSR_WRITE_INT(lsr, 1, 1, name);	lsr_write_vluimsbf5(lsr, count, "name");	for (i=0; i<count; i++) {		Fixed f = * (Fixed *) gf_list_get(*l, i);		if (!f || (f == FIX_ONE)) {			GF_LSR_WRITE_INT(lsr, 1, 1, "hasShort");			GF_LSR_WRITE_INT(lsr, f ? 0 : 1, 1, "isZero");		} else {			u32 ft = (u32) ( FIX2FLT(f) * 4096/*(1<<12)*/ );			GF_LSR_WRITE_INT(lsr, 0, 1, "hasShort");			GF_LSR_WRITE_INT(lsr, ft, 12, "val");		}	}}static void lsr_write_float_list(GF_LASeRCodec *lsr, GF_List **l, const char *name){	u32 i, count = l ? gf_list_count(*l) : 0;	if (!count) {		GF_LSR_WRITE_INT(lsr, 0, 1, name);		return;	}	GF_LSR_WRITE_INT(lsr, 1, 1, name);	lsr_write_vluimsbf5(lsr, count, "count");	for (i=0;i<count;i++) {		Fixed *v = (Fixed *)gf_list_get(*l, i);		lsr_write_fixed_16_8(lsr, *v, "val");	}}static u32 lsr_get_bit_size(GF_LASeRCodec *lsr, Fixed v) {	u32 val;	v = gf_divfix(v, lsr->res_factor);	val = (v<0) ? FIX2INT(-v) : FIX2INT(v);	return 1 + gf_get_bit_size(val);}static void lsr_write_point_sequence(GF_LASeRCodec *lsr, GF_List **pts, const char *name){	u32 i, count = pts ? gf_list_count(*pts) : 0;	lsr_write_vluimsbf5(lsr, count, "nbPoints");	if (!count) return;	/*TODO golomb coding*/	GF_LSR_WRITE_INT(lsr, 0, 1, "flag");    if (1) {        if (count < 3) {			u32 nb_bits = 0;			for (i=0; i<count; i++) {				u32 k;				SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i);				k = lsr_get_bit_size(lsr, pt->x); if (k>nb_bits) nb_bits = k;				k = lsr_get_bit_size(lsr, pt->y); if (k>nb_bits) nb_bits = k;			}			GF_LSR_WRITE_INT(lsr, nb_bits, 5, "bits");            for (i=0; i<count; i++) {				SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i);				u32 v = lsr_translate_coords(lsr, pt->x, nb_bits);				GF_LSR_WRITE_INT(lsr, v, nb_bits, "x");				v = lsr_translate_coords(lsr, pt->y, nb_bits);				GF_LSR_WRITE_INT(lsr, v, nb_bits, "y");            }        } else {			Fixed c_x, c_y;			u32 k, nb_dx, nb_dy;			SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, 0);			nb_dx = 0;			k = lsr_get_bit_size(lsr, pt->x); if (k>nb_dx) nb_dx = k;			k = lsr_get_bit_size(lsr, pt->y); if (k>nb_dx) nb_dx = k;			GF_LSR_WRITE_INT(lsr, nb_dx, 5, "bits");			k = lsr_translate_coords(lsr, pt->x, nb_dx);			GF_LSR_WRITE_INT(lsr, k, nb_dx, "x");			k = lsr_translate_coords(lsr, pt->y, nb_dx);			GF_LSR_WRITE_INT(lsr, k, nb_dx, "y");			c_x = pt->x;			c_y = pt->y;			nb_dx = nb_dy = 0;			for (i=1; i<count; i++) {				SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i);				k = lsr_get_bit_size(lsr, pt->x - c_x); if (k>nb_dx) nb_dx = k;				k = lsr_get_bit_size(lsr, pt->y - c_y); if (k>nb_dy) nb_dy = k;				c_x = pt->x;				c_y = pt->y;			}			GF_LSR_WRITE_INT(lsr, nb_dx, 5, "bitsx");			GF_LSR_WRITE_INT(lsr, nb_dy, 5, "bitsy");			c_x = pt->x;			c_y = pt->y;			for (i=1; i<count; i++) {				SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i);				k = lsr_translate_coords(lsr, pt->x - c_x, nb_dx);				GF_LSR_WRITE_INT(lsr, k, nb_dx, "dx");				k = lsr_translate_coords(lsr, pt->y - c_y, nb_dy);				GF_LSR_WRITE_INT(lsr, k, nb_dy, "dy");				c_x = pt->x;				c_y = pt->y;			}        }	}}static void lsr_write_path_type(GF_LASeRCodec *lsr, SVG_PathData *path, const char *name){#if USE_GF_PATH    	u32 i, *contour, nb_types;	GF_List *pts = gf_list_new();	contour = path->contours;	nb_types = 0;	for (i=0; i<path->n_points; ) {		switch (path->tags[i]) {		case GF_PATH_CURVE_ON:			gf_list_add(pts, &path->points[i]);			nb_types++;			i++;			break;		case GF_PATH_CLOSE:			nb_types++;			i++;			break;		case GF_PATH_CURVE_CONIC:			gf_list_add(pts, &path->points[i]);			gf_list_add(pts, &path->points[i+1]);			i+=2;			nb_types++;			break;		case GF_PATH_CURVE_CUBIC:			gf_list_add(pts, &path->points[i]);			gf_list_add(pts, &path->points[i+1]);			gf_list_add(pts, &path->points[i+2]);			i+=3;			nb_types++;			break;		}	}	lsr_write_point_sequence(lsr, &pts, "seq");	gf_list_del(pts);	/*first moveTo is skiped*/	lsr_write_vluimsbf5(lsr, nb_types-1, "nbOfTypes");	for (i=0; i<path->n_points; ) {		switch (path->tags[i]) {		case GF_PATH_CLOSE:			/*close*/			GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_Z, 5, name);			i++;			break;		case GF_PATH_CURVE_ON:			if (!i) {			} else if (*contour == i-1) {				/*moveTo*/				GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_M, 5, name);			} else {				/*lineTo*/				GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_L, 5, name);			}			i++;			break;		case GF_PATH_CURVE_CONIC:			/*Conic*/			GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_Q, 5, name);			i+=2;			break;		case GF_PATH_CURVE_CUBIC:			/*cubic*/			GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_C, 5, name);			i+=3;			break;		}	}#else	u32 i, count;	lsr_write_point_sequence(lsr, path->points, "seq");	/*initial move is not coded*/	count = gf_list_count(path->commands);    lsr_write_vluimsbf5(lsr, count, "nbOfTypes");    for (i; i<count; i++) {        u8 type = *(u8 *) gf_list_get(path->commands, i);		GF_LSR_WRITE_INT(lsr, type, 5, name);    }#endif}static void lsr_write_rotate_type(GF_LASeRCodec *lsr, SVG_Rotate *rotate, const char *name){	GF_LSR_WRITE_INT(lsr, rotate ? 1 : 0, 1, name);	if (!rotate) return;	if ((rotate->type == SVG_NUMBER_AUTO) || (rotate->type == SVG_NUMBER_AUTO_REVERSE)) {		GF_LSR_WRITE_INT(lsr, 1, 1, "choice");		GF_LSR_WRITE_INT(lsr, (rotate->type == SVG_NUMBER_AUTO) ? 0 : 1, 1, "rotate");	} else {		GF_LSR_WRITE_INT(lsr, 0, 1, "choice");		lsr_write_fixed_16_8(lsr, rotate->value, "rotate");	}}static void lsr_write_sync_behavior(GF_LASeRCodec *lsr, SMIL_SyncBehavior *sync, const char *name){	GF_LSR_WRITE_INT(lsr, sync ? 1 : 0, 1, name);	if (!sync) return;	assert(*sync!=SMIL_SYNCBEHAVIOR_INHERIT);	GF_LSR_WRITE_INT(lsr, *sync-1, 2, name);}static void lsr_write_sync_tolerance(GF_LASeRCodec *lsr, SMIL_SyncTolerance *sync, const char *name){	GF_LSR_WRITE_INT(lsr, sync ? 1 : 0, 1, name);	if (!sync) return;	assert(sync->type!=SMIL_SYNCTOLERANCE_INHERIT);	if (sync->type==SMIL_SYNCTOLERANCE_DEFAULT) {		GF_LSR_WRITE_INT(lsr, 1, 1, name);	} else {		GF_LSR_WRITE_INT(lsr, 0, 1, name);		lsr_write_vluimsbf5(lsr, (u32) (sync->value*lsr->time_resolution), "value");	}}static void lsr_write_coord_list(GF_LASeRCodec *lsr, GF_List **coords, const char *name){	u32 i, count = coords ? gf_list_count(*coords) : 0;	if (!count) {		GF_LSR_WRITE_INT(lsr, 0, 1, name);	} else {		GF_LSR_WRITE_INT(lsr, 1, 1, name);	    lsr_write_vluimsbf5(lsr, count, "nb_coords");		for (i=0; i<count; i++) {			SVG_Coordinate *c = (SVG_Coordinate *)gf_list_get(*coords, i);			u32 res = lsr_translate_coords(lsr, c->value, lsr->coord_bits);			GF_LSR_WRITE_INT(lsr, res, lsr->coord_bits, name);		}	}}static void lsr_write_transform_behavior(GF_LASeRCodec *lsr, SVG_TransformBehavior *type){	GF_LSR_WRITE_INT(lsr, type ? 1 : 0, 1, "hasTransformBehavior");	if (!type) return;	GF_LSR_WRITE_INT(lsr, *type, 4, "transformBehavior");}static void lsr_write_gradient_units(GF_LASeRCodec *lsr, SVG_GradientUnit *type){	GF_LSR_WRITE_INT(lsr, type ? 1 : 0, 1, "hasGradientUnits");	if (!type) return;	GF_LSR_WRITE_INT(lsr, *type ? 1 : 0, 1, "gradientUnits");}static void lsr_write_content_type(GF_LASeRCodec *lsr, SVG_String *type, const char *name){	if (type) {		GF_LSR_WRITE_INT(lsr, 1, 1, "hasType");		lsr_write_byte_align_string(lsr, *type, "type");	} else {		GF_LSR_WRITE_INT(lsr, 0, 1, "hasType");	}}static void lsr_write_script_type(GF_LASeRCodec *lsr, SVG_String *type){	GF_LSR_WRITE_INT(lsr, type ? 1 : 0, 1, "hasType");	if (!type) return;	if (!strcmp(*type, "application/ecmascript")) {		GF_LSR_WRITE_INT(lsr, 1, 1, "choice");		GF_LSR_WRITE_INT(lsr, 0, 1, "script");	} else if (!strcmp(*type, 

⌨️ 快捷键说明

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