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

📄 vrml_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
	char str[1000];	u32 id;	GF_Node *n;	JSString *s;	GF_JSField *f;	const char *name;	if (! JS_InstanceOf(c, obj, &js_rt->SFNodeClass, NULL) ) return JS_FALSE;	f = (GF_JSField *) JS_GetPrivate(c, obj);	if (!f) return JS_FALSE;	str[0] = 0;	n = * ((GF_Node **)f->field.far_ptr);	name = gf_node_get_name_and_id(n, &id);	if (id) {		if (name) {			sprintf(str , "DEF %s ", name);		} else {			sprintf(str , "DEF %d ", id - 1);		}	}	strcat(str, gf_node_get_class_name(n));	s = JS_NewStringCopyZ(c, (const char *) str);	if (!s) return JS_FALSE;	*rval = STRING_TO_JSVAL(s); 	return JS_TRUE; }/* Generic field destructor */static void field_finalize(JSContext *c, JSObject *obj){	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	JS_ObjectDestroyed(c, obj);	if (!ptr) return;	if (ptr->field_ptr) gf_sg_vrml_field_pointer_del(ptr->field_ptr, ptr->field.fieldType);	free(ptr);}/*SFImage class functions */static GFINLINE GF_JSField *SFImage_Create(JSContext *c, JSObject *obj, u32 w, u32 h, u32 nbComp, MFInt32 *pixels){	u32 i, len;	GF_JSField *field;	SFImage *v;	field = NewJSField();	v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFIMAGE);	field->field_ptr = field->field.far_ptr = v;	field->field.fieldType = GF_SG_VRML_SFIMAGE;	v->width = w;	v->height = h;	v->numComponents = nbComp;	v->pixels = (u8 *) malloc(sizeof(u8) * nbComp * w * h);	len = MIN(nbComp * w * h, pixels->count);	for (i=0; i<len; i++) v->pixels[i] = (u8) pixels->vals[i];	JS_SetPrivate(c, obj, field);	return field;}static JSBool SFImageConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){	u32 w, h, nbComp;	MFInt32 *pixels;	if (argc<4) return 0;	if (!JSVAL_IS_INT(argv[0]) || !JSVAL_IS_INT(argv[1]) || !JSVAL_IS_INT(argv[2])) return JS_FALSE;	if (!JSVAL_IS_OBJECT(argv[3]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[3]), &js_rt->MFInt32Class, NULL)) return JS_FALSE;	w = JSVAL_TO_INT(argv[0]);	h = JSVAL_TO_INT(argv[1]);	nbComp = JSVAL_TO_INT(argv[2]);	pixels = (MFInt32 *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[3])))->field.far_ptr;	SFImage_Create(c, obj, w, h, nbComp, pixels);	return JS_TRUE;}static JSBool image_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	GF_ScriptPriv *priv = JS_GetScriptStack(c);	GF_JSField *val = (GF_JSField *) JS_GetPrivate(c, obj);	SFImage *sfi = (SFImage*)val->field.far_ptr;	if (JSVAL_IS_INT(id)) {		switch (JSVAL_TO_INT(id)) {		case 0: *vp = INT_TO_JSVAL( sfi->width ); break;		case 1: *vp = INT_TO_JSVAL( sfi->height); break;		case 2: *vp = INT_TO_JSVAL( sfi->numComponents ); break;		case 3: 		{			u32 i, len;			JSObject *an_obj = JS_ConstructObject(priv->js_ctx, &js_rt->MFInt32Class, 0, priv->js_obj);			len = sfi->width*sfi->height*sfi->numComponents;			for (i=0; i<len; i++) {				jsval newVal = INT_TO_JSVAL(sfi->pixels[i]);				JS_SetElement(priv->js_ctx, an_obj, (jsint) i, &newVal);			}		}			break;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool image_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	u32 ival;	Bool changed = 0;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	SFImage *sfi = (SFImage*)ptr->field.far_ptr;	if (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0 && JSVAL_TO_INT(id) < 4) {		switch (JSVAL_TO_INT(id)) {		case 0: 			ival = JSVAL_TO_INT(vp);			changed = ! (sfi->width == ival);			sfi->width = ival;			if (changed && sfi->pixels) { free(sfi->pixels); sfi->pixels = NULL; }			break;		case 1: 			ival = JSVAL_TO_INT(vp);			changed = ! (sfi->height == ival);			sfi->height = ival;			if (changed && sfi->pixels) { free(sfi->pixels); sfi->pixels = NULL; }			break;		case 2: 			ival = JSVAL_TO_INT(vp);			changed = ! (sfi->numComponents == ival);			sfi->numComponents = ival;			if (changed && sfi->pixels) { free(sfi->pixels); sfi->pixels = NULL; }			break;		case 3:		{			MFInt32 *pixels;			u32 len, i;			if (!JSVAL_IS_OBJECT(*vp) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(*vp), &js_rt->MFInt32Class, NULL)) return JS_FALSE;			pixels = (MFInt32 *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(*vp)))->field.far_ptr;			if (sfi->pixels) free(sfi->pixels);			len = sfi->width*sfi->height*sfi->numComponents;			sfi->pixels = (char *) malloc(sizeof(char)*len);			len = MAX(len, pixels->count);			for (i=0; i<len; i++) sfi->pixels[i] = (u8) pixels->vals[i];			changed = 1;			break;		}		default: return JS_FALSE;		}		if (changed) Script_FieldChanged(c, NULL, ptr, NULL);		return JS_TRUE;    }	return JS_FALSE;}/*SFVec2f class functions */static GFINLINE GF_JSField *SFVec2f_Create(JSContext *c, JSObject *obj, Fixed x, Fixed y){	GF_JSField *field;	SFVec2f *v;	field = NewJSField();	v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFVEC2F);	field->field_ptr = field->field.far_ptr = v;	field->field.fieldType = GF_SG_VRML_SFVEC2F;	v->x = x;	v->y = y;	JS_SetPrivate(c, obj, field);	return field;}static JSBool SFVec2fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){	jsdouble x = 0.0, y = 0.0;	if (argc > 0) JS_ValueToNumber(c, argv[0], &x);	if (argc > 1) JS_ValueToNumber(c, argv[1], &y);	SFVec2f_Create(c, obj, FLT2FIX( x), FLT2FIX( y));	return JS_TRUE;}static JSBool vec2f_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	GF_JSField *val = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id)) {		switch (JSVAL_TO_INT(id)) {		case 0: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec2f*)val->field.far_ptr)->x) )); break;		case 1: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec2f*)val->field.far_ptr)->y) )); break;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool vec2f_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	jsdouble d;	Fixed v;	Bool changed = 0;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0 && JSVAL_TO_INT(id) < 2 && JS_ValueToNumber(c, *vp, &d)) {		switch (JSVAL_TO_INT(id)) {		case 0: 			v = FLT2FIX( d);			changed = ! ( ((SFVec2f*)ptr->field.far_ptr)->x == v);			((SFVec2f*)ptr->field.far_ptr)->x = v;			break;		case 1: 			v = FLT2FIX( d);			changed = ! ( ((SFVec2f*)ptr->field.far_ptr)->y == v);			((SFVec2f*)ptr->field.far_ptr)->y = v;			break;		default: return JS_FALSE;		}		if (changed) Script_FieldChanged(c, NULL, ptr, NULL);		return JS_TRUE;    }	return JS_FALSE;}static JSBool vec2f_add(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec2f *v1, *v2;	JSObject *pNew;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec2fClass, NULL))		return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj));  	SFVec2f_Create(c, pNew, v1->x + v2->x, v1->y + v2->y);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec2f_subtract(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec2f *v1, *v2;	JSObject *pNew;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec2fClass, NULL))		return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj));  	SFVec2f_Create(c, pNew, v1->x - v2->x, v1->y - v2->y);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec2f_negate(JSContext *c, JSObject *obj, uintN n, jsval *v, jsval *rval){	SFVec2f *v1;	JSObject *pNew;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj));  	SFVec2f_Create(c, pNew, -v1->x , -v1->y );	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec2f_multiply(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec2f *v1;	JSObject *pNew;	jsdouble d;	Fixed v;	if (argc<=0) return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj));  	JS_ValueToNumber(c, argv[0], &d );	v = FLT2FIX( d);	SFVec2f_Create(c, pNew, gf_mulfix(v1->x , v), gf_mulfix(v1->y, v) );	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec2f_divide(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec2f *v1;	JSObject *pNew;	jsdouble d;	Fixed v;	if (argc<=0) return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj));  	JS_ValueToNumber(c, argv[0], &d );	v = FLT2FIX(d);	SFVec2f_Create(c, pNew, gf_divfix(v1->x, v),  gf_divfix(v1->y, v));	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec2f_length(JSContext *c, JSObject *obj, uintN n, jsval *val, jsval *rval){	Double res;	SFVec2f *v1;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	res = FIX2FLT(gf_v2d_len(v1));	*rval = DOUBLE_TO_JSVAL(JS_NewDouble(c, res) );	return JS_TRUE;}static JSBool vec2f_normalize(JSContext *c, JSObject *obj, uintN n, jsval *val, jsval *rval){	SFVec2f *v1;	Fixed res;	JSObject *pNew;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	res = gf_v2d_len(v1);	pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj));  	SFVec2f_Create(c, pNew, gf_divfix(v1->x, res), gf_divfix(v1->y, res) );	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec2f_dot(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec2f *v1, *v2;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec2fClass, NULL))		return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	*rval = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( gf_mulfix(v1->x, v2->x) + gf_mulfix(v1->y, v2->y) ) ) );	return JS_TRUE;}/*SFVec3f class functions */static GFINLINE GF_JSField *SFVec3f_Create(JSContext *c, JSObject *obj, Fixed x, Fixed y, Fixed z){	GF_JSField *field;	SFVec3f *v;	field = NewJSField();	v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFVEC3F);	field->field_ptr = field->field.far_ptr = v;	field->field.fieldType = GF_SG_VRML_SFVEC3F;	v->x = x;	v->y = y;	v->z = z;	JS_SetPrivate(c, obj, field);	return field;}static JSBool SFVec3fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){	jsdouble x = 0.0, y = 0.0, z = 0.0;	if (argc > 0) JS_ValueToNumber(c, argv[0], &x);	if (argc > 1) JS_ValueToNumber(c, argv[1], &y);	if (argc > 2) JS_ValueToNumber(c, argv[2], &z);	SFVec3f_Create(c, obj, FLT2FIX( x), FLT2FIX( y), FLT2FIX( z));	return JS_TRUE;}static JSBool vec3f_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	GF_JSField *val = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id)) {		switch (JSVAL_TO_INT(id)) {		case 0: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec3f*)val->field.far_ptr)->x) )); break;		case 1: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec3f*)val->field.far_ptr)->y) )); break;		case 2: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec3f*)val->field.far_ptr)->z) )); break;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool vec3f_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	jsdouble d;	Fixed v;	Bool changed = 0;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0 && JSVAL_TO_INT(id) < 3 && JS_ValueToNumber(c, *vp, &d)) {		switch (JSVAL_TO_INT(id)) {		case 0: 			v = FLT2FIX( d);			changed = ! ( ((SFVec3f*)ptr->field.far_ptr)->x == v);			((SFVec3f*)ptr->field.far_ptr)->x = v;			break;		case 1: 			v = FLT2FIX( d);			changed = ! ( ((SFVec3f*)ptr->field.far_ptr)->y == v);			((SFVec3f*)ptr->field.far_ptr)->y = v;			break;		case 2: 			v = FLT2FIX( d);			changed = ! ( ((SFVec3f*)ptr->field.far_ptr)->z == v);			((SFVec3f*)ptr->field.far_ptr)->z = v;			break;		default: return JS_FALSE;		}		if (changed) Script_FieldChanged(c, NULL, ptr, NULL);		return JS_TRUE;    }	return JS_FALSE;}static JSBool vec3f_add(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f *v1, *v2;	JSObject *pNew;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec3fClass, NULL))		return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	SFVec3f_Create(c, pNew, v1->x + v2->x, v1->y + v2->y, v1->z + v2->z);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec3f_subtract(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f *v1, *v2;	JSObject *pNew;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec3fClass, NULL))		return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	SFVec3f_Create(c, pNew, v1->x - v2->x, v1->y - v2->y, v1->z - v2->z);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}

⌨️ 快捷键说明

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