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

📄 scene_dump.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
void DumpSFField(GF_SceneDumper *sdump, u32 type, void *ptr, Bool is_mf){	switch (type) {	case GF_SG_VRML_SFBOOL:		fprintf(sdump->trace, "%s", * ((SFBool *)ptr) ? "TRUE" : "FALSE");		break;	case GF_SG_VRML_SFINT32:		fprintf(sdump->trace, "%d", * ((SFInt32 *)ptr) );		break;	case GF_SG_VRML_SFFLOAT:		fprintf(sdump->trace, "%g", FIX2FLT( * ((SFFloat *)ptr) ) );		break;	case GF_SG_VRML_SFDOUBLE:		fprintf(sdump->trace, "%g", * ((SFDouble *)ptr) );		break;	case GF_SG_VRML_SFTIME:		fprintf(sdump->trace, "%g", * ((SFTime *)ptr) );		break;	case GF_SG_VRML_SFCOLOR:		fprintf(sdump->trace, "%g %g %g", FIX2FLT( ((SFColor *)ptr)->red ), FIX2FLT( ((SFColor *)ptr)->green ), FIX2FLT( ((SFColor *)ptr)->blue ));		break;	case GF_SG_VRML_SFCOLORRGBA:		fprintf(sdump->trace, "%g %g %g %g", FIX2FLT( ((SFColorRGBA *)ptr)->red ), FIX2FLT( ((SFColorRGBA *)ptr)->green ), FIX2FLT( ((SFColorRGBA *)ptr)->blue ), FIX2FLT( ((SFColorRGBA *)ptr)->alpha ));		break;	case GF_SG_VRML_SFVEC2F:		fprintf(sdump->trace, "%g %g", FIX2FLT( ((SFVec2f *)ptr)->x ), FIX2FLT( ((SFVec2f *)ptr)->y ));		break;	case GF_SG_VRML_SFVEC2D:		fprintf(sdump->trace, "%g %g", ((SFVec2d *)ptr)->x, ((SFVec2d *)ptr)->y);		break;	case GF_SG_VRML_SFVEC3F:		fprintf(sdump->trace, "%g %g %g", FIX2FLT( ((SFVec3f *)ptr)->x ), FIX2FLT( ((SFVec3f *)ptr)->y ), FIX2FLT( ((SFVec3f *)ptr)->z ));		break;	case GF_SG_VRML_SFVEC3D:		fprintf(sdump->trace, "%g %g %g", ((SFVec3d *)ptr)->x, ((SFVec3d *)ptr)->y, ((SFVec3d *)ptr)->z);		break;	case GF_SG_VRML_SFROTATION:		fprintf(sdump->trace, "%g %g %g %g", FIX2FLT( ((SFRotation *)ptr)->x ), FIX2FLT( ((SFRotation *)ptr)->y ), FIX2FLT( ((SFRotation *)ptr)->z ), FIX2FLT( ((SFRotation *)ptr)->q ) );		break;	case GF_SG_VRML_SFSCRIPT:	{		u32 len, i;		char *str;		u16 *uniLine;		str = (char*)((SFScript *)ptr)->script_text;		len = strlen(str);		uniLine = (u16*)malloc(sizeof(short) * len);		len = gf_utf8_mbstowcs(uniLine, len, (const char **) &str);		if (len != (size_t) -1) {			if (!sdump->XMLDump) fputc('\"', sdump->trace);			for (i=0; i<len; i++) {				if (!sdump->XMLDump) {#ifndef __SYMBIAN32__					fputwc(uniLine[i], sdump->trace);#else					fputc(uniLine[i], sdump->trace);#endif				} else {					switch (uniLine[i]) {					case '&': fprintf(sdump->trace, "&amp;"); break;					case '<': fprintf(sdump->trace, "&lt;"); break;					case '>': fprintf(sdump->trace, "&gt;"); break;					case '\'': 					case '"': 						fprintf(sdump->trace, "&apos;");						break;					case 0:						break;					/*FIXME: how the heck can we preserve newlines and spaces of JavaScript in 					an XML attribute in any viewer ? */					default:						if (uniLine[i]<128) {							fprintf(sdump->trace, "%c", (u8) uniLine[i]);						} else {							fprintf(sdump->trace, "&#%d;", uniLine[i]);						}						break;					}				}			} 			if (!sdump->XMLDump) fprintf(sdump->trace, "\"\n");		}		free(uniLine);		DUMP_IND(sdump);	}		break;	case GF_SG_VRML_SFSTRING:	{		char *str;		if (sdump->XMLDump) {			if (is_mf) fprintf(sdump->trace, sdump->X3DDump ? "\"" : "&quot;");		} else {			fprintf(sdump->trace, "\"");		}		/*dump in unicode*/		str = ((SFString *)ptr)->buffer;		if (str && str[0]) {			if (sdump->XMLDump) {				DumpUTFString(sdump, str);			} else if (!strchr(str, '\"')) {				fprintf(sdump->trace, "%s", str);			} else {				u32 i, len = strlen(str);				for (i=0; i<len; i++) {					if (str[i]=='\"') fputc('\\', sdump->trace);					fputc(str[i], sdump->trace);				}			}		}		if (sdump->XMLDump) {			if (is_mf) fprintf(sdump->trace, sdump->X3DDump ? "\"" : "&quot;");		} else {			fprintf(sdump->trace, "\"");		}	}		break;	case GF_SG_VRML_SFURL:		if (((SFURL *)ptr)->url) {#if 0			u32 len;			char *str;			short uniLine[5000];			str = ((SFURL *)ptr)->url;			len = gf_utf8_mbstowcs(uniLine, 5000, (const char **) &str);			if (len != (size_t) -1) {				fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ?  "'" : "&quot;") : "\"");				fwprintf(sdump->trace, (unsigned short *) uniLine);				fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ?  "'" : "&quot;") : "\"");			}#else			fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ?  "'" : "&quot;") : "\"");			fprintf(sdump->trace, ((SFURL *)ptr)->url);			fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ?  "'" : "&quot;") : "\"");#endif		} else {			if (sdump->XMLDump) {				fprintf(sdump->trace, "&quot;od://od%d&quot;", ((SFURL *)ptr)->OD_ID);			} else {				fprintf(sdump->trace, "od:%d", ((SFURL *)ptr)->OD_ID);			}		}		break;	case GF_SG_VRML_SFIMAGE:	{		u32 i, count;		SFImage *img = (SFImage *)ptr;		fprintf(sdump->trace, "%d %d %d", img->width, img->height, img->numComponents);		count = img->width * img->height * img->numComponents;		for (i=0; i<count; ) {			switch (img->numComponents) {			case 1:				fprintf(sdump->trace, " 0x%02X", img->pixels[i]);				i++;				break;			case 2:				fprintf(sdump->trace, " 0x%02X%02X", img->pixels[i], img->pixels[i+1]);				i+=2;				break;			case 3:				fprintf(sdump->trace, " 0x%02X%02X%02X", img->pixels[i], img->pixels[i+1], img->pixels[i+2]);				i+=3;				break;			case 4:				fprintf(sdump->trace, " 0x%02X%02X%02X%02X", img->pixels[i], img->pixels[i+1], img->pixels[i+2], img->pixels[i+3]);				i+=4;				break;			}		}	}	break;	}}void DumpFieldValue(GF_SceneDumper *sdump, GF_FieldInfo field){	GenMFField *mffield;	u32 i, sf_type;	GF_ChildNodeItem *list;	void *slot_ptr;	switch (field.fieldType) {	case GF_SG_VRML_SFNODE:		assert ( *(GF_Node **)field.far_ptr);		DumpNode(sdump, *(GF_Node **)field.far_ptr, 0, NULL);		return;	case GF_SG_VRML_MFNODE:		list = * ((GF_ChildNodeItem **) field.far_ptr);		assert( list );		sdump->indent++;		while (list) {			DumpNode(sdump, list->node, 1, NULL);			list = list->next;		}		sdump->indent--;		return;	case GF_SG_VRML_SFCOMMANDBUFFER:		{		}		return;	}	if (gf_sg_vrml_is_sf_field(field.fieldType)) {		if (sdump->XMLDump) StartAttribute(sdump, "value");		DumpSFField(sdump, field.fieldType, field.far_ptr, 0);		if (sdump->XMLDump) EndAttribute(sdump);	} else {		mffield = (GenMFField *) field.far_ptr;		sf_type = gf_sg_vrml_get_sf_type(field.fieldType);		if (!sdump->XMLDump) {			fprintf(sdump->trace, "[");		} else if (sf_type==GF_SG_VRML_SFSTRING) {			fprintf(sdump->trace, " value=\'");		} else {			StartAttribute(sdump, "value");		}		for (i=0; i<mffield->count; i++) {			if (i) fprintf(sdump->trace, " ");			gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i);			/*this is to cope with single MFString which shall appear as SF in XMT*/			DumpSFField(sdump, sf_type, slot_ptr, 1);		}		if (!sdump->XMLDump) {			fprintf(sdump->trace, "]");		} else if (sf_type==GF_SG_VRML_SFSTRING) {			fprintf(sdump->trace, "\'");		} else {			EndAttribute(sdump);		}	}}Bool SD_NeedsFieldContainer(GF_Node *node, GF_FieldInfo *fi){	u32 i, count, nb_ndt;	GF_FieldInfo info;	if (!strcmp(fi->name, "children")) return 0;	nb_ndt = 0;	count = gf_node_get_field_count(node);	for (i=0; i<count; i++) {		gf_node_get_field(node, i, &info);		if ((info.eventType==GF_SG_EVENT_IN) || (info.eventType==GF_SG_EVENT_OUT)) continue;		if (info.NDTtype==fi->NDTtype) nb_ndt++;	}	return (nb_ndt>1) ? 1 : 0;}void DumpField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo field){	GenMFField *mffield;	u32 i, sf_type;	Bool needs_field_container;	GF_ChildNodeItem *list;	void *slot_ptr;	switch (field.fieldType) {	case GF_SG_VRML_SFNODE:		assert ( *(GF_Node **)field.far_ptr);				if (sdump->XMLDump) {			if (!sdump->X3DDump) {				StartElement(sdump, (char *) field.name);				EndElementHeader(sdump, 1);				sdump->indent++;			}		} else {			StartAttribute(sdump, (char *)field.name);		}		DumpNode(sdump, *(GF_Node **)field.far_ptr, 0, NULL);				if (sdump->XMLDump) {			if (!sdump->X3DDump) {				sdump->indent--;				EndElement(sdump, (char *) field.name, 1);			}		} else {			EndAttribute(sdump);		}		return;	case GF_SG_VRML_MFNODE:		needs_field_container = 0;		if (sdump->XMLDump && sdump->X3DDump) needs_field_container = SD_NeedsFieldContainer(node, &field);		if (!sdump->X3DDump) {			if (gf_node_get_tag(node)==TAG_X3D_Switch) field.name = "choice";		}		list = * ((GF_ChildNodeItem **) field.far_ptr);		assert(list);		if (!sdump->XMLDump || !sdump->X3DDump) StartList(sdump, (char *) field.name);		sdump->indent++;		while (list) {			DumpNode(sdump, list->node, 1, needs_field_container ? (char *) field.name : NULL);			list = list->next;		}		sdump->indent--;		if (!sdump->XMLDump || !sdump->X3DDump) EndList(sdump, (char *) field.name);		return;	case GF_SG_VRML_SFCOMMANDBUFFER:	{		SFCommandBuffer *cb = (SFCommandBuffer *)field.far_ptr;		StartElement(sdump, (char *) field.name);		EndElementHeader(sdump, 1);		sdump->indent++;		if (!gf_list_count(cb->commandList)) {			/*the arch does not allow for that (we would need a codec and so on, or decompress the command list			in all cases...)*/			if (sdump->trace && cb->bufferSize) {				if (sdump->XMLDump) fprintf(sdump->trace, "<!--SFCommandBuffer cannot be dumped while playing - use MP4Box instead-->\n");				else fprintf(sdump->trace, "#SFCommandBuffer cannot be dumped while playing - use MP4Box instead\n");			}		} else {			gf_sm_dump_command_list(sdump, cb->commandList, sdump->indent, 0);		}		sdump->indent--;		EndElement(sdump, (char *) field.name, 1);	}		return;	}	if (gf_sg_vrml_is_sf_field(field.fieldType)) {		StartAttribute(sdump, (char *) field.name);		DumpSFField(sdump, field.fieldType, field.far_ptr, 0);		EndAttribute(sdump);	} else {		mffield = (GenMFField *) field.far_ptr;		sf_type = gf_sg_vrml_get_sf_type(field.fieldType);		if (sdump->XMLDump && sdump->X3DDump) {			switch (sf_type) {			case GF_SG_VRML_SFSTRING:			case GF_SG_VRML_SFSCRIPT:			case GF_SG_VRML_SFURL:				fprintf(sdump->trace, " %s=\'", (char *) field.name);				break;			default:				StartAttribute(sdump, (char *) field.name);				break;			}		} else {			StartAttribute(sdump, (char *) field.name);		}		if (!sdump->XMLDump) fprintf(sdump->trace, "[");		for (i=0; i<mffield->count; i++) {			if (i) fprintf(sdump->trace, " ");			gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i);			DumpSFField(sdump, sf_type, slot_ptr, 1);		}		if (!sdump->XMLDump) fprintf(sdump->trace, "]");				if (sdump->XMLDump && sdump->X3DDump) {			switch (sf_type) {			case GF_SG_VRML_SFSTRING:			case GF_SG_VRML_SFSCRIPT:			case GF_SG_VRML_SFURL:				fprintf(sdump->trace, "\'");				break;			default:				EndAttribute(sdump);				break;			}		} else {			EndAttribute(sdump);		}	}}const char * GetXMTFieldTypeName(u32 fieldType){	switch (fieldType) {	case GF_SG_VRML_SFBOOL: return "Boolean";	case GF_SG_VRML_SFINT32: return "Integer";	case GF_SG_VRML_SFCOLOR: return "Color";	case GF_SG_VRML_SFVEC2F: return "Vector2";	case GF_SG_VRML_SFIMAGE: return "Image";	case GF_SG_VRML_SFTIME: return "Time";	case GF_SG_VRML_SFFLOAT: return "Float";	case GF_SG_VRML_SFVEC3F: return "Vector3";	case GF_SG_VRML_SFROTATION: return "Rotation";	case GF_SG_VRML_SFSTRING: return "String";	case GF_SG_VRML_SFNODE: return "Node";	case GF_SG_VRML_MFBOOL: return "Booleans";	case GF_SG_VRML_MFINT32: return "Integers";	case GF_SG_VRML_MFCOLOR: return "Colors";	case GF_SG_VRML_MFVEC2F: return "Vector2s";	case GF_SG_VRML_MFIMAGE: return "Images";	case GF_SG_VRML_MFTIME: return "Times";	case GF_SG_VRML_MFFLOAT: return "Floats";	case GF_SG_VRML_MFVEC3F: return "Vector3s";	case GF_SG_VRML_MFROTATION: return "Rotations";	case GF_SG_VRML_MFSTRING: return "Strings";	case GF_SG_VRML_MFNODE: return "Nodes";	default: return "unknown";	}}const char * GetXMTFieldTypeValueName(u32 fieldType){	switch (fieldType) {	case GF_SG_VRML_SFBOOL: return "booleanValue";	case GF_SG_VRML_SFINT32: return "integerValue";	case GF_SG_VRML_SFCOLOR: return "colorValue";	case GF_SG_VRML_SFVEC2F: return "vector2Value";	case GF_SG_VRML_SFIMAGE: return "imageValue";	case GF_SG_VRML_SFTIME: return "timeValue";	case GF_SG_VRML_SFFLOAT: return "floatValue";	case GF_SG_VRML_SFVEC3F: return "vector3Value";	case GF_SG_VRML_SFROTATION: return "rotationValue";	case GF_SG_VRML_SFSTRING: return "stringValue";	case GF_SG_VRML_MFBOOL: return "booleanArrayValue";	case GF_SG_VRML_MFINT32: return "integerArrayValue";	case GF_SG_VRML_MFCOLOR: return "colorArrayValue";	case GF_SG_VRML_MFVEC2F: return "vector2ArrayValue";	case GF_SG_VRML_MFIMAGE: return "imageArrayValue";	case GF_SG_VRML_MFTIME: return "timeArrayValue";	case GF_SG_VRML_MFFLOAT: return "floatArrayValue";	case GF_SG_VRML_MFVEC3F: return "vector3ArrayValue";	case GF_SG_VRML_MFROTATION: return "rotationArrayValue";	case GF_SG_VRML_MFSTRING: return "stringArrayValue";	default: return "unknown";	}}const char *SD_GetQuantCatName(u32 QP_Type){	switch (QP_Type) {	case QC_3DPOS: return "position3D";	case QC_2DPOS: return "position2D";	case QC_ORDER: return "drawingOrder";	case QC_COLOR: return "color";	case QC_TEXTURE_COORD: return "textureCoordinate";	case QC_ANGLE: return "angle";	case QC_SCALE: return "scale";	case QC_INTERPOL_KEYS: return "keys";	case QC_NORMALS: return "normals";	case QC_ROTATION: return "rotations";	case QC_SIZE_3D: return "size3D";	case QC_SIZE_2D: return "size2D";	case QC_LINEAR_SCALAR: return "linear";	case QC_COORD_INDEX: return "coordIndex";	default: return "unknown";	}}/*field dumping for proto declaration and Script*/void DumpDynField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo field, Bool has_sublist){	GenMFField *mffield;	u32 i, sf_type;	void *slot_ptr;	if (gf_sg_vrml_is_sf_field(field.fieldType)) {		DUMP_IND(sdump);

⌨️ 快捷键说明

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