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

📄 loader_bt.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (parser->last_error) return;		gf_bt_parse_int(parser, "height", (SFInt32 *)&img->height);		if (parser->last_error) return;		gf_bt_parse_int(parser, "nbComp", (SFInt32 *)&v);		if (parser->last_error) return;		img->numComponents = v;		size = img->width * img->height * img->numComponents;		if (img->pixels) free(img->pixels);		img->pixels = (unsigned char*)malloc(sizeof(char) * size);		for (i=0; i<size; i++) {			str = gf_bt_get_next(parser, 0);			if (strstr(str, "0x")) sscanf(str, "%x", &v);			else sscanf(str, "%d", &v);			switch (img->numComponents) {			case 1:				img->pixels[i] = (char) v;				break;			case 2:				img->pixels[i] = (char) (v>>8)&0xFF;				img->pixels[i+1] = (char) (v)&0xFF;				i++;				break;			case 3:				img->pixels[i] = (char) (v>>16)&0xFF;				img->pixels[i+1] = (char) (v>>8)&0xFF;				img->pixels[i+2] = (char) (v)&0xFF;				i+=2;				break;			case 4:				img->pixels[i] = (char) (v>>24)&0xFF;				img->pixels[i+1] = (char) (v>>16)&0xFF;				img->pixels[i+2] = (char) (v>>8)&0xFF;				img->pixels[i+3] = (char) (v)&0xFF;				i+=3;				break;			}		}	}		break;	case GF_SG_VRML_SFSCRIPT:	{		SFScript *sc = (SFScript *) info->far_ptr;		if (!gf_bt_check_code(parser, '\"')) {			gf_bt_report(parser, GF_BAD_PARAM, "\" expected in Script");		}		sc->script_text = (unsigned char*)gf_bt_get_string(parser);	}		break;	default:		parser->last_error = GF_NOT_SUPPORTED;		break;	}	gf_bt_check_code(parser, ','); 	return;err:	gf_bt_report(parser, GF_BAD_PARAM, "%s: Invalid field syntax", info->name);}void gf_bt_mffield(GF_BTParser *parser, GF_FieldInfo *info, GF_Node *n){	GF_FieldInfo sfInfo;	Bool force_single = 0;	if (!gf_bt_check_code(parser, '[')) {		if (parser->is_extern_proto_field) return;		force_single = 1;	}	sfInfo.fieldType = gf_sg_vrml_get_sf_type(info->fieldType);	sfInfo.name = info->name;	gf_sg_vrml_mf_reset(info->far_ptr, info->fieldType);	while (!gf_bt_check_code(parser, ']')) {		gf_sg_vrml_mf_append(info->far_ptr, info->fieldType, &sfInfo.far_ptr);		gf_bt_sffield(parser, &sfInfo, n);		if (parser->last_error) return;		gf_bt_check_code(parser, ','); 		if (force_single) break;	}}Bool gf_bt_check_ndt(GF_BTParser *parser, GF_FieldInfo *info, GF_Node *node, GF_Node *parent){	if (!node) return 1;	if (parent->sgprivate->tag == TAG_MPEG4_Script) return 1;	if (parent->sgprivate->tag == TAG_X3D_Script) return 1;	if (node->sgprivate->tag == TAG_UndefinedNode) return 1;	/*this handles undefined nodes*/	if (gf_node_in_table(node, info->NDTtype)) return 1;	/*not found*/	gf_bt_report(parser, GF_BAD_PARAM, "node %s not valid in field %s\n", gf_node_get_class_name(node), info->name);	gf_node_unregister(node, parent);	return 0;}u32 gf_bt_get_next_node_id(GF_BTParser *parser){	u32 ID;	GF_SceneGraph *sc = parser->load->scene_graph;	if (parser->parsing_proto) sc = gf_sg_proto_get_graph(parser->parsing_proto);	ID = gf_sg_get_next_available_node_id(sc);	if (parser->load->ctx && (ID>parser->load->ctx->max_node_id)) 		parser->load->ctx->max_node_id = ID;	return ID;}u32 gf_bt_get_next_route_id(GF_BTParser *parser){	u32 ID;	GF_SceneGraph *sg = parser->load->scene_graph;	if (parser->parsing_proto) sg = gf_sg_proto_get_graph(parser->parsing_proto);	ID = gf_sg_get_next_available_route_id(sg);	if (parser->load->ctx && (ID>parser->load->ctx->max_route_id)) 		parser->load->ctx->max_route_id = ID;	return ID;}u32 gf_bt_get_next_proto_id(GF_BTParser *parser){	u32 ID;	GF_SceneGraph *sc = parser->load->scene_graph;	if (parser->parsing_proto) sc = gf_sg_proto_get_graph(parser->parsing_proto);	ID = gf_sg_get_next_available_proto_id(sc);	if (parser->load->ctx && (ID>parser->load->ctx->max_node_id)) 		parser->load->ctx->max_proto_id = ID;	return ID;}u32 gf_bt_get_def_id(GF_BTParser *parser, char *defName){	GF_Node *n;	u32 ID;	if (sscanf(defName, "N%d", &ID) == 1) {		ID ++;		n = gf_sg_find_node(parser->load->scene_graph, ID);		/*if an existing node use*/		if (n) {			u32 id;			u32 nID = gf_bt_get_next_node_id(parser);			const char *name = gf_node_get_name_and_id(n, &id);			gf_bt_report(parser, GF_OK, "changing node \"%s\" ID from %d to %d", name, id -1, nID-1);			gf_node_set_id(n, nID, name);		}		if (parser->load->ctx && (parser->load->ctx->max_node_id<ID)) parser->load->ctx->max_node_id=ID;	} else {		ID = gf_bt_get_next_node_id(parser);	}	return ID;}Bool gf_bt_set_field_is(GF_BTParser *parser, GF_FieldInfo *info, GF_Node *n){	GF_Err e;	u32 i;	GF_ProtoFieldInterface *pfield;	GF_FieldInfo pinfo;	char *str;	gf_bt_check_line(parser);	i=0;	while ((parser->line_buffer[parser->line_pos + i] == ' ') || (parser->line_buffer[parser->line_pos + i] == '\t')) i++;	if (strnicmp(&parser->line_buffer[parser->line_pos + i] , "IS", 2)) return 0;	str = gf_bt_get_next(parser, 0);	str = gf_bt_get_next(parser, 0);	/*that's an ISed field*/	pfield = gf_sg_proto_field_find_by_name(parser->parsing_proto, str);	if (!pfield) {		gf_bt_report(parser, GF_BAD_PARAM, "%s: Unknown proto field", str);		return 1;	}	gf_sg_proto_field_get_field(pfield, &pinfo);	e = gf_sg_proto_field_set_ised(parser->parsing_proto, pinfo.fieldIndex, n, info->fieldIndex);	if (e) gf_bt_report(parser, GF_BAD_PARAM, "IS: Invalid field type for field %s", info->name);	return 1;}void gf_bt_check_unresolved_nodes(GF_BTParser *parser){	u32 i, count;	count = gf_list_count(parser->undef_nodes); 	if (!count) return;	for (i=0; i<count; i++) {		GF_Node *n = (GF_Node *)gf_list_get(parser->undef_nodes, i);		gf_bt_report(parser, GF_BAD_PARAM, "Cannot find node %s\n", gf_node_get_name(n) );	}	parser->last_error = GF_BAD_PARAM;}Bool gf_bt_has_been_def(GF_BTParser *parser, char *node_name){	u32 i, count;	count = gf_list_count(parser->def_nodes);	for (i=0; i<count; i++) {		GF_Node *n = (GF_Node *) gf_list_get(parser->def_nodes, i);		if (!strcmp(gf_node_get_name(n), node_name)) return 1;	}	return 0;}u32 gf_bt_get_node_tag(GF_BTParser *parser, char *node_name) {	u32 tag;	/*if VRML and allowing non MPEG4 nodes, use X3D*/	if (parser->is_wrl && !(parser->load->flags & GF_SM_LOAD_MPEG4_STRICT)) {		tag = gf_node_x3d_type_by_class_name(node_name);		if (!tag) tag = gf_node_mpeg4_type_by_class_name(node_name);		if (tag) return tag;		if (!strcmp(node_name, "Rectangle")) return TAG_X3D_Rectangle2D;		if (!strcmp(node_name, "Circle")) return TAG_X3D_Circle2D;	} else {		tag = gf_node_mpeg4_type_by_class_name(node_name);		if (!tag) {			if (!strcmp(node_name, "Rectangle2D")) return TAG_MPEG4_Rectangle;			if (!strcmp(node_name, "Circle2D")) return TAG_MPEG4_Circle;			if (!(parser->load->flags & GF_SM_LOAD_MPEG4_STRICT)) return gf_node_x3d_type_by_class_name(node_name);		}	}	return tag;}GF_Node *gf_bt_sf_node(GF_BTParser *parser, char *node_name, GF_Node *parent, char *szDEFName){	u32 tag, ID;	Bool is_script, replace_prev, register_def;	GF_Proto *proto;	GF_Node *node, *newnode, *undef_node;	GF_FieldInfo info;	Bool init_node;	char *name;	char * str;	init_node = 0;	if (node_name) {		str = node_name;	} else {		str = gf_bt_get_next(parser, 0);	}	name = NULL;	if (!strcmp(str, "NULL")) return NULL;	ID = 0;	register_def = 0;	replace_prev = 0;	undef_node = NULL;	if (!strcmp(str, "DEF")) {		register_def = 1;		str = gf_bt_get_next(parser, 0);		name = strdup(str);		str = gf_bt_get_next(parser, 0);	} else if (szDEFName) {		name = strdup(szDEFName);		register_def = 1;	}	if (name) {		undef_node = gf_sg_find_node_by_name(parser->load->scene_graph, name);		if (undef_node) {			gf_list_del_item(parser->peeked_nodes, undef_node);			ID = gf_node_get_id(undef_node);			/*if we see twice a DEF N1 then force creation of a new node*/			if (gf_bt_has_been_def(parser, name)) {				undef_node = NULL;				ID = gf_bt_get_def_id(parser, name);				gf_bt_report(parser, GF_OK, "Node %s has been DEFed several times, IDs may get corrupted", name);			}		} else {			ID = gf_bt_get_def_id(parser, name);		}	}	else if (!strcmp(str, "USE")) {		str = gf_bt_get_next(parser, 0);		node = gf_sg_find_node_by_name(parser->load->scene_graph, str);		if (!node) {			/*create a temp node (undefined)*/			node = gf_bt_new_node(parser, TAG_UndefinedNode);			ID = gf_bt_get_def_id(parser, str);			gf_node_set_id(node, ID, str);			gf_list_add(parser->undef_nodes, node);		} 		gf_node_register(node, parent);		return node;	}	proto = NULL;	tag = gf_bt_get_node_tag(parser, str);	if (!tag) {		GF_SceneGraph *sg = parser->load->scene_graph;		while (1) {			proto = gf_sg_find_proto(sg, 0, str);			if (proto) break;			sg = sg->parent_scene;			if (!sg) break;		}		if (!proto) {			/*locate proto*/			gf_bt_report(parser, GF_BAD_PARAM, "%s: not a valid/supported node", str);			return NULL;		}		tag = TAG_ProtoNode;	}	if (undef_node && (undef_node->sgprivate->tag == tag)) {		node = undef_node;	} else {		if (undef_node) replace_prev = 1;		if (proto) {			node = gf_sg_proto_create_instance(parser->load->scene_graph, proto);		} else {			node = gf_bt_new_node(parser, tag);		}		if (!parser->parsing_proto) init_node = 1;	}	is_script = 0;	if ((tag==TAG_MPEG4_Script) || (tag==TAG_X3D_Script))		is_script = 1;	if (!node) {		parser->last_error = GF_SG_UNKNOWN_NODE;		return NULL;	}	if (register_def) gf_list_add(parser->def_nodes, node);	gf_node_register(node, parent);	/*VRML: "The transformation hierarchy shall be a directed acyclic graph; results are undefined if a node 	in the transformation hierarchy is its own ancestor"	that's good, because the scene graph can't handle cyclic graphs (destroy will never be called).	However we still have to register the node before parsing it, to update node registry and get correct IDs*/	if (name) {		if (!undef_node || replace_prev) {			gf_node_set_id(node, ID, name);		}		free(name);		name = NULL;	}	if (!parser->parsing_proto) gf_bt_update_timenode(parser, node);	if (gf_bt_check_code(parser, '{')) {		while (1) {			if (gf_bt_check_code(parser, '}')) 				break;			str = gf_bt_get_next(parser, 0);			if (!str) {				gf_bt_report(parser, GF_BAD_PARAM, "Invalid node syntax");				goto err;			}			/*VRML/X3D specific */			if (parser->is_wrl) {				/*we ignore bboxCenter and bboxSize*/				if (!strcmp(str, "bboxCenter") || !strcmp(str, "bboxSize")) {					Fixed f;					gf_bt_parse_float(parser, "x", &f);					gf_bt_parse_float(parser, "y", &f);					gf_bt_parse_float(parser, "z", &f);					continue;				}				/*some VRML files declare routes almost anywhere*/				if (!strcmp(str, "ROUTE")) {					gf_bt_parse_route(parser, 1, 0, NULL);					continue;				}			}						parser->last_error = gf_node_get_field_by_name(node, str, &info);			/*check common VRML fields removed in MPEG4*/			if (parser->last_error) {				if (!parser->is_wrl) {					/*we ignore 'solid' for MPEG4 box/cone/etc*/					if (!strcmp(str, "solid")) {						Bool b;						gf_bt_parse_bool(parser, "solid", &b);						parser->last_error = GF_OK;						continue;					}					/*we ignore 'description' for MPEG4 sensors*/					else if (!strcmp(str, "description")) {						char *str = gf_bt_get_string(parser); 						free(str);						parser->last_error = GF_OK;						continue;					}					/*remaps X3D to old VRML/MPEG4*/					else if ((tag==TAG_MPEG4_LOD) && !strcmp(str, "children")) {						str = "level";						parser->last_error = gf_node_get_field_by_name(node, str, &info);					}					else if ((tag==TAG_MPEG4_Switch) && !strcmp(str, "children")) {						str = "choice";						parser->last_error = gf_node_get_field_by_name(node, str, &info);					}					else if (!strcmp(str, "enabled")) {						Bool b;						gf_bt_parse_bool(parser, "collide", &b);						parser->last_error = GF_OK;						continue;					}				} else {					/*remaps old VRML/MPEG4 to X3D if possible*/					if ((tag==TAG_X3D_LOD) && !strcmp(str, "level")) {						str = "children";						parser->last_error = gf_node_get_field_by_name(node, str, &info);					}					else if ((tag==TAG_X3D_Switch) && !strcmp(str, "choice")) {						str = "children";						parser->last_error = gf_node_get_field_by_name(node, str, &info);					}					else if (!strcmp(str, "collide")) {						Bool b;						gf_bt_parse_bool(parser, "enabled", &b);						parser->last_error = GF_OK;						continue;					}				}			}			if (is_script && parser->last_error) {				u32 eType, fType;				GF_ScriptField *sf;				eType = 0;				if (!strcmp(str, "eventIn") || !strcmp(str, "inputOnly")) eType = GF_SG_SCRIPT_TYPE_EVENT_IN;				else if (!strcmp(str, "eventOut") || !strcmp(str, "outputOnly")) eType = GF_SG_SCRIPT_TYPE_EVENT_OUT;				else if (!strcmp(str, "field") || !strcmp(str, "initializeOnly")) eType = GF_SG_SCRIPT_TYPE_FIELD;				else {					gf_bt_report(parser, GF_BAD_PARAM, "%s: Unknown script event type", str);					goto err;				}				str = gf_bt_get_next(parser, 0);				fType = gf_sg_field_type_by_name(str);				if (fType==GF_SG_VRML_UNKNOWN) {					gf_bt_report(parser, GF_BAD_PARAM, "%s: Unknown script field type", str);

⌨️ 快捷键说明

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