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

📄 vrml_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
	ptr->field.fieldType = fieldType;	ptr->js_list = JS_NewArrayObject(c, (jsint) argc, argv);	JS_SetPrivate(c, obj, ptr);	*rval = OBJECT_TO_JSVAL(obj);	return obj == 0 ? JS_FALSE : JS_TRUE;}static JSBool MFBoolConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFBOOL);}static JSBool MFInt32Constructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFINT32);}static JSBool MFFloatConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFFLOAT);}static JSBool MFTimeConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFTIME);}static JSBool MFStringConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFSTRING);}static JSBool MFURLConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFURL);}static JSBool MFNodeConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFNODE);}static void array_finalize(JSContext *c, JSObject *obj){	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	JS_ObjectDestroyed(c, obj);	if (!ptr) return;	GF_LOG(GF_LOG_DEBUG, GF_LOG_SCRIPT, ("[VRML JS] unregistering MFField %s\n", ptr->field.name));	/*MFNode*/	if (ptr->temp_list) {		gf_node_unregister_children(ptr->owner, ptr->temp_list);	} 	if (ptr->field_ptr) {		gf_sg_vrml_field_pointer_del(ptr->field_ptr, ptr->field.fieldType);	}	free(ptr);}JSBool array_getElement(JSContext *c, JSObject *obj, jsval id, jsval *rval){	u32 i;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id)) {		i = JSVAL_TO_INT(id);		JS_GetElement(c, ptr->js_list, (jsint) i, rval);	}	return JS_TRUE;}//this could be overloaded for each MF type...JSBool array_setElement(JSContext *c, JSObject *obj, jsval id, jsval *rval){	u32 ind, len;	jsdouble d;	GF_JSField *from;	JSBool ret;	JSClass *the_sf_class = NULL;	JSString *str;	char *str_val;	void *sf_slot;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	ind = JSVAL_TO_INT(id);	ret = JS_GetArrayLength(c, ptr->js_list, &len);	if (ret==JS_FALSE) return JS_FALSE;	switch (ptr->field.fieldType) {	case GF_SG_VRML_MFVEC2F: the_sf_class = &js_rt->SFVec2fClass; break;	case GF_SG_VRML_MFVEC3F: the_sf_class = &js_rt->SFVec3fClass; break;	case GF_SG_VRML_MFCOLOR: the_sf_class = &js_rt->SFColorClass; break;	case GF_SG_VRML_MFROTATION: the_sf_class = &js_rt->SFRotationClass; break;	}	/*dynamic expend*/	if (ind>=len) {		ret = JS_SetArrayLength(c, ptr->js_list, len+1);		if (ret==JS_FALSE) return JS_FALSE;		while (len<ind) {			jsval a_val;			switch (ptr->field.fieldType) {			case GF_SG_VRML_MFBOOL: 				a_val = BOOLEAN_TO_JSVAL(0); 				break;			case GF_SG_VRML_MFINT32: 				a_val = INT_TO_JSVAL(0); 				break;			case GF_SG_VRML_MFFLOAT: 			case GF_SG_VRML_MFTIME: 				a_val = DOUBLE_TO_JSVAL( JS_NewDouble(c, 0) );				break;			case GF_SG_VRML_MFSTRING:			case GF_SG_VRML_MFURL:				a_val = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "") );				break;			case GF_SG_VRML_MFVEC2F: 			case GF_SG_VRML_MFVEC3F: 			case GF_SG_VRML_MFCOLOR:			case GF_SG_VRML_MFROTATION: 				a_val = OBJECT_TO_JSVAL( JS_ConstructObject(c, the_sf_class, 0, obj) );				break;			default: 				a_val = INT_TO_JSVAL(0); 				break;			}			if (ptr->field.fieldType!=GF_SG_VRML_MFNODE)				gf_sg_vrml_mf_insert(ptr->field.far_ptr, ptr->field.fieldType, &sf_slot, len);			JS_SetElement(c, ptr->js_list, len, &a_val);			len++;		}		if (ptr->field.fieldType!=GF_SG_VRML_MFNODE)			gf_sg_vrml_mf_insert(ptr->field.far_ptr, ptr->field.fieldType, &sf_slot, ind);	}	/*assign object*/	if (ptr->field.fieldType==GF_SG_VRML_MFNODE) {		if (JSVAL_IS_VOID(*rval) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(*rval), &js_rt->SFNodeClass, NULL) ) return JS_FALSE;	} else if (the_sf_class) {		if (JSVAL_IS_VOID(*rval)) return JS_FALSE;		if (!JS_InstanceOf(c, JSVAL_TO_OBJECT(*rval), the_sf_class, NULL) ) return JS_FALSE;	} else if (ptr->field.fieldType==GF_SG_VRML_MFBOOL) {		if (!JSVAL_IS_BOOLEAN(*rval)) return JS_FALSE;	} else if (ptr->field.fieldType==GF_SG_VRML_MFINT32) {		if (!JSVAL_IS_INT(*rval)) return JS_FALSE;	} else if (ptr->field.fieldType==GF_SG_VRML_MFFLOAT) {		if (!JSVAL_IS_NUMBER(*rval)) return JS_FALSE;	} else if (ptr->field.fieldType==GF_SG_VRML_MFTIME) {		if (!JSVAL_IS_NUMBER(*rval)) return JS_FALSE;	} else if (ptr->field.fieldType==GF_SG_VRML_MFSTRING) {		if (!JSVAL_IS_STRING(*rval)) return JS_FALSE;	} else if (ptr->field.fieldType==GF_SG_VRML_MFURL) {		if (!JSVAL_IS_STRING(*rval)) return JS_FALSE;	}	ret = JS_SetElement(c, ptr->js_list, ind, rval);	if (ret==JS_FALSE) return JS_FALSE;	if (!ptr->owner) return JS_TRUE;	/*rewrite MFNode entry*/	if (ptr->field.fieldType==GF_SG_VRML_MFNODE) {		GF_Node *prev_n, *new_n;		/*get and delete previous node if any, but unregister later*/		prev_n = gf_node_list_del_child_idx( (GF_ChildNodeItem **)ptr->field.far_ptr, ind);		/*get new node*/		from = (GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(*rval));		new_n = *(GF_Node**)from->field.far_ptr;		if (new_n) {			gf_node_list_insert_child( (GF_ChildNodeItem **)ptr->field.far_ptr , new_n, ind);			gf_node_register(new_n, ptr->owner);		}		/*unregister previous node*/		if (prev_n) gf_node_unregister(prev_n, ptr->owner);		Script_FieldChanged(c, NULL, ptr, NULL);		return JS_TRUE;	}	/*rewrite MF slot*/	switch (ptr->field.fieldType) {	case GF_SG_VRML_MFBOOL:		((MFBool *)ptr->field.far_ptr)->vals[ind] = (Bool) JSVAL_TO_BOOLEAN(*rval);		break;	case GF_SG_VRML_MFINT32:		((MFInt32 *)ptr->field.far_ptr)->vals[ind] = (s32) JSVAL_TO_INT(*rval);		break;	case GF_SG_VRML_MFFLOAT:		JS_ValueToNumber(c, *rval, &d);		((MFFloat *)ptr->field.far_ptr)->vals[ind] = FLT2FIX(d);		break;	case GF_SG_VRML_MFTIME:		JS_ValueToNumber(c, *rval, &d);		((MFTime *)ptr->field.far_ptr)->vals[ind] = d;		break;	case GF_SG_VRML_MFSTRING:		if (((MFString *)ptr->field.far_ptr)->vals[ind]) {			free(((MFString *)ptr->field.far_ptr)->vals[ind]);			((MFString *)ptr->field.far_ptr)->vals[ind] = NULL;		}		str = JSVAL_IS_STRING(*rval) ? JSVAL_TO_STRING(*rval) : JS_ValueToString(c, *rval);		str_val = JS_GetStringBytes(str);		((MFString *)ptr->field.far_ptr)->vals[ind] = strdup(str_val);		break;	case GF_SG_VRML_MFURL:		if (((MFURL *)ptr->field.far_ptr)->vals[ind].url) {			free(((MFURL *)ptr->field.far_ptr)->vals[ind].url);			((MFURL *)ptr->field.far_ptr)->vals[ind].url = NULL;		}		str = JSVAL_IS_STRING(*rval) ? JSVAL_TO_STRING(*rval) : JS_ValueToString(c, *rval);		str_val = JS_GetStringBytes(str);		((MFURL *)ptr->field.far_ptr)->vals[ind].url = strdup(str_val);		((MFURL *)ptr->field.far_ptr)->vals[ind].OD_ID = 0;		break;	case GF_SG_VRML_MFVEC2F:	case GF_SG_VRML_MFVEC3F:	case GF_SG_VRML_MFROTATION:	case GF_SG_VRML_MFCOLOR:		from = (GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(*rval));		gf_sg_vrml_field_copy(& ((GenMFField *)ptr->field.far_ptr)->array[ind], from->field.far_ptr, from->field.fieldType);		break;	}	Script_FieldChanged(c, NULL, ptr, NULL);	return JS_TRUE;}JSBool array_setLength(JSContext *c, JSObject *obj, jsval v, jsval *val){	u32 len, i, sftype;	JSBool ret;	JSClass *the_sf_class;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (!JSVAL_IS_INT(*val) || JSVAL_TO_INT(*val) < 0) return JS_FALSE;	len = JSVAL_TO_INT(*val);	ret = JS_SetArrayLength(c, ptr->js_list, len);	if (ret==JS_FALSE) return ret;	#if 0	/*insert till index if needed*/	if (ptr->field.fieldType != GF_SG_VRML_MFNODE) {		if (!ptr->field.far_ptr) ptr->field_ptr = ptr->field.far_ptr = gf_sg_vrml_field_pointer_new(ptr->field.fieldType);		gf_sg_vrml_mf_reset(ptr->field.far_ptr, ptr->field.fieldType);		gf_sg_vrml_mf_alloc(ptr->field.far_ptr, ptr->field.fieldType, len);		if (ptr->field_ptr) ptr->field_ptr = ptr->field.far_ptr;	}#endif	the_sf_class = NULL;	switch (ptr->field.fieldType) {	case GF_SG_VRML_MFVEC2F: the_sf_class = &js_rt->SFVec2fClass; break;	case GF_SG_VRML_MFVEC3F: the_sf_class = &js_rt->SFVec3fClass; break;	case GF_SG_VRML_MFCOLOR: the_sf_class = &js_rt->SFColorClass; break;	case GF_SG_VRML_MFROTATION: the_sf_class = &js_rt->SFRotationClass; break;	case GF_SG_VRML_MFNODE: the_sf_class = &js_rt->SFNodeClass; break;	}	sftype = gf_sg_vrml_get_sf_type(ptr->field.fieldType);	for (i=0; i<len; i++) {		jsval a_val;		if (the_sf_class) {			JSObject *an_obj = JS_ConstructObject(c, the_sf_class, 0, obj);			a_val = OBJECT_TO_JSVAL(an_obj );		} else {			switch (sftype) {			case GF_SG_VRML_SFBOOL: a_val = BOOLEAN_TO_JSVAL(0); break;			case GF_SG_VRML_SFINT32: a_val = INT_TO_JSVAL(0); break;			case GF_SG_VRML_SFFLOAT: 			case GF_SG_VRML_SFTIME: 				a_val = DOUBLE_TO_JSVAL( JS_NewDouble(c, 0) );				break;			case GF_SG_VRML_SFSTRING:			case GF_SG_VRML_SFURL:				a_val = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "") );				break;			default: a_val = INT_TO_JSVAL(0); break;			}		}		JS_SetElement(c, ptr->js_list, i, &a_val);	}	return JS_TRUE;}JSBool array_getLength(JSContext *c, JSObject *obj, jsval v, jsval *val){	jsuint len;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	JSBool ret = JS_GetArrayLength(c, ptr->js_list, &len);	*val = INT_TO_JSVAL(len);	return ret;}/* MFVec2f class constructor */static JSBool MFVec2fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	jsval val;	JSObject *item;	u32 i;	GF_JSField *ptr = NewJSField();	ptr->js_list = JS_NewArrayObject(c, 0, 0);	JS_SetArrayLength(c, ptr->js_list, argc);	JS_SetPrivate(c, obj, ptr);	for (i=0; i<argc; i++) {		if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFVec2fClass, NULL) ) {			item = JS_ConstructObject(c, &js_rt->SFVec2fClass, 0, obj);			val = OBJECT_TO_JSVAL(item);			JS_SetElement(c, ptr->js_list, i, &val);		} else {			JS_SetElement(c, ptr->js_list, i, &argv[i]);		}	}	*rval = OBJECT_TO_JSVAL(obj);	return obj == 0 ? JS_FALSE : JS_TRUE;}/* MFVec3f class constructor */static JSBool MFVec3fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	jsval val;	JSObject *item;	u32 i;	GF_JSField *ptr = NewJSField();	ptr->field.fieldType = GF_SG_VRML_MFVEC3F;	ptr->js_list = JS_NewArrayObject(c, (jsint) argc, argv);	JS_SetArrayLength(c, ptr->js_list, argc);	JS_SetPrivate(c, obj, ptr);	for (i=0; i<argc; i++) {		if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFVec3fClass, NULL) ) {			item = JS_ConstructObject(c, &js_rt->SFVec3fClass, 0, obj);			val = OBJECT_TO_JSVAL(item);			JS_SetElement(c, ptr->js_list, i, &val);		} else {			JS_SetElement(c, ptr->js_list, i, &argv[i]);		}	}	*rval = OBJECT_TO_JSVAL(obj);	return obj == 0 ? JS_FALSE : JS_TRUE;}/* MFRotation class constructor */static JSBool MFRotationConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	jsval val;	JSObject *item;	u32 i;	GF_JSField *ptr = NewJSField();	ptr->field.fieldType = GF_SG_VRML_MFROTATION;	ptr->js_list = JS_NewArrayObject(c, 0, 0);	JS_SetArrayLength(c, ptr->js_list, argc);	JS_SetPrivate(c, obj, ptr);	for (i=0; i<argc; i++) {		if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFRotationClass, NULL) ) {			item = JS_ConstructObject(c, &js_rt->SFVec3fClass, 0, obj);			val = OBJECT_TO_JSVAL(item);			JS_SetElement(c, ptr->js_list, i, &val);		} else {			JS_SetElement(c, ptr->js_list, i, &argv[i]);		}	}	*rval = OBJECT_TO_JSVAL(obj);	return obj == 0 ? JS_FALSE : JS_TRUE;}/*MFColor class constructor */static JSBool MFColorConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	jsval val;	JSObject *item;	u32 i;	GF_JSField *ptr = NewJSField();	ptr->field.fieldType = GF_SG_VRML_MFCOLOR;	ptr->js_list = JS_NewArrayObject(c, 0, 0);	JS_SetArrayLength(c, ptr->js_list, argc);	JS_SetPrivate(c, obj, ptr);	for (i=0; i<argc; i++) {		if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFColorClass, NULL) ) {			item = JS_ConstructObject(c, &js_rt->SFColorClass, 0, obj);			val = OBJECT_TO_JSVAL(item);			JS_SetElement(c, ptr->js_list, i, &val);		} else {			JS_SetElement(c, ptr->js_list, i, &argv[i]);		}	}	*rval = OBJECT_TO_JSVAL(obj);	return obj == 0 ? JS_FALSE : JS_TRUE;}void gf_sg_script_init_sm_api(GF_ScriptPriv *sc, GF_Node *script){	/*GCC port: classes are declared within code since JS_PropertyStub and co are exported symbols	from JS runtime lib, so with non-constant addresses*/	GF_SETUP_JS(js_rt->globalClass, "global", JSCLASS_HAS_PRIVATE, 		JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, 		JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub);	GF_SETUP_JS(js_rt->browserClass , "Browser", 0,		JS_PropertyStub,  JS_PropertyStub,  JS_PropertyStub, JS_PropertyStub,		JS_EnumerateStub, JS_ResolveStub,   JS_ConvertStub,  JS_FinalizeStub);	GF_SETUP_JS(js_rt->SFNodeClass, "SFNode", JSCLASS_HAS_PRIVATE,		JS_PropertyStub,  JS_PropertyStub,  node_getProperty, node_setProperty,		JS_EnumerateStub, JS_ResolveStub,   JS_ConvertStub,  node_finalize);	GF_SETUP_JS(js_rt->SFVec2fClass , "SFVec2f", JSCLASS_HAS_PRIVATE,	  JS_PropertyStub,  JS_PropertyStub,  vec2f_ge

⌨️ 快捷键说明

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