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

📄 svg_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 4 页
字号:
		return JS_FALSE;	/*currentTranslate*/	case 3:		if (n->sgprivate->tag!=TAG_SVG_svg) return JS_FALSE;		if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_GET_TRANSLATE, (GF_Node *)n, &par)) {			JSObject *r = JS_NewObject(c, &svg_rt->pointClass, 0, 0);			pointCI *rc = malloc(sizeof(pointCI));			rc->x = FIX2FLT(par.pt.x);			rc->y = FIX2FLT(par.pt.y);			rc->sg = n->sgprivate->scenegraph;			JS_SetPrivate(c, r, rc);			*vp = OBJECT_TO_JSVAL(r);			return JS_TRUE;		}		return JS_FALSE;	/*viewport*/	case 4:		if (n->sgprivate->tag!=TAG_SVG_svg) return JS_FALSE;		if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_GET_VIEWPORT, (GF_Node *)n, &par)) {			JSObject *r = JS_NewObject(c, &svg_rt->rectClass, 0, 0);			rectCI *rc = malloc(sizeof(rectCI));			rc->x = FIX2FLT(par.rc.x);			rc->y = FIX2FLT(par.rc.y);			rc->w = FIX2FLT(par.rc.width);			rc->h = FIX2FLT(par.rc.height);			rc->sg = n->sgprivate->scenegraph;			JS_SetPrivate(c, r, rc);			*vp = OBJECT_TO_JSVAL(r);			return JS_TRUE;		}		return JS_FALSE;	/*currentTime*/	case 5: 		d = JS_NewDouble(c, gf_node_get_scene_time((GF_Node *)n) );		*vp = DOUBLE_TO_JSVAL(d);		return JS_TRUE;	/*isPaused*/	case 6: 		*vp = BOOLEAN_TO_JSVAL(JS_FALSE);		return JS_TRUE;	/*ownerSVGElement*/	case 7:		while (1) {			GF_Node *par = gf_node_get_parent(_n, 0);			if (!par) return JS_FALSE;			if (par->sgprivate->tag==TAG_SVG_svg) {				*vp = dom_element_construct(c, par);				return JS_TRUE;			}			_n = par;		}		return JS_FALSE;	default: 		return JS_FALSE;	}#if 0	} else if (JSVAL_IS_STRING(id)) {		GF_Node *n = JS_GetPrivate(c, obj);		GF_FieldInfo info;		char *name = JS_GetStringBytes(JSVAL_TO_STRING(id));		if ( gf_node_get_field_by_name(n, name, &info) != GF_OK) return JS_TRUE;		switch (info.fieldType) {		case SVG_Length_datatype:		case SVG_Coordinate_datatype: 		case SVG_FontSize_datatype:		case SVG_Rotate_datatype:		case SVG_Number_datatype:			if ( ((SVG_Number*)info.far_ptr)->type==SVG_NUMBER_INHERIT) {				JSString *s = JS_NewStringCopyZ(c, "inherit");				*vp = STRING_TO_JSVAL(s);			} else {				jsdouble *d = JS_NewDouble(c, FIX2FLT(((SVG_Number*)info.far_ptr)->value) );				*vp = DOUBLE_TO_JSVAL(d);			}			return JS_TRUE;		}	}	return JS_TRUE;#endif}JSBool svg_udom_set_property(JSContext *c, GF_Node *n, u32 svg_prop_id, jsval *vp){	GF_JSAPIParam par;	jsdouble d;	switch (svg_prop_id) {	/*id - FIXME*/	case 0: 		return JS_TRUE;	/*currentScale*/	case 1: 		if (!JSVAL_IS_NUMBER(*vp) || (n->sgprivate->tag!=TAG_SVG_svg)) return JS_FALSE;		JS_ValueToNumber(c, *vp, &d);		par.val = FLT2FIX(d);		if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_SET_SCALE, (GF_Node *)n, &par)) {			return JS_TRUE;		}		return JS_FALSE;	/*currentRotate*/	case 2: 		if (!JSVAL_IS_NUMBER(*vp) || (n->sgprivate->tag!=TAG_SVG_svg)) return JS_FALSE;		JS_ValueToNumber(c, *vp, &d);		par.val = FLT2FIX(d);		if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_SET_ROTATION, (GF_Node *)n, &par)) {			return JS_TRUE;		}		return JS_FALSE;	/*currentTime*/	case 5:		if (!JSVAL_IS_NUMBER(*vp) || (n->sgprivate->tag!=TAG_SVG_svg)) return JS_FALSE;		JS_ValueToNumber(c, *vp, &d);		par.time = d;		if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_SET_TIME, (GF_Node *)n, &par)) {			return JS_TRUE;		}		return JS_FALSE;	default: 		return JS_FALSE;	}#if 0	} else if (JSVAL_IS_STRING(id)) {		GF_Node *n = JS_GetPrivate(c, obj);		GF_FieldInfo info;		char *name = JS_GetStringBytes(JSVAL_TO_STRING(id));		if ( gf_node_get_field_by_name(n, name, &info) != GF_OK) return JS_TRUE;		if (JSVAL_IS_STRING(*vp)) {			char *str = JS_GetStringBytes(JSVAL_TO_STRING(*vp));			gf_svg_parse_attribute(n, &info, str, 0);		} else {			switch (info.fieldType) {			case SVG_Length_datatype:			case SVG_Coordinate_datatype: 			case SVG_FontSize_datatype:			case SVG_Rotate_datatype:			case SVG_Number_datatype:				if (JSVAL_IS_NUMBER(*vp)) {					jsdouble d;					JS_ValueToNumber(c, *vp, &d);					((SVG_Number*)info.far_ptr)->type = SVG_NUMBER_VALUE;					((SVG_Number*)info.far_ptr)->value = FLT2FIX(d);				} else {					return JS_FALSE;				}				break;			default:				return JS_FALSE;			}			svg_node_changed(n, &info);			return JS_TRUE;		}	}	return JS_TRUE;#endif}static JSBool svg_connection_set_encoding(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_FALSE;}static JSBool svg_connection_create(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_FALSE;}static JSBool svg_connection_connect(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_FALSE;}static JSBool svg_connection_send(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_FALSE;}static JSBool svg_connection_close(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_FALSE;}static JSPropertySpec connectionProps[] = {	{"connected",			0,       JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY},	{0}};static JSFunctionSpec connectionFuncs[] = {	/*eventTarget interface*/	{"addEventListenerNS", dom_event_add_listener, 4},	{"removeEventListenerNS", dom_event_remove_listener, 4},	{"addEventListenerNS", dom_event_add_listener, 3},	{"removeEventListenerNS", dom_event_remove_listener, 3},	/*connection interface*/	{"setEncoding", svg_connection_set_encoding, 1},	{"connect", svg_connection_connect, 1},	{"send", svg_connection_send, 1},	{"close", svg_connection_close, 0},	{0}};static void baseCI_finalize(JSContext *c, JSObject *obj){	void *data = JS_GetPrivate(c, obj);	if (data) free(data);}static JSBool rgb_constructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	rgbCI *p;	GF_SAFEALLOC(p, rgbCI);	JS_SetPrivate(c, obj, p);	*rval = OBJECT_TO_JSVAL(obj);	return JS_TRUE;}static JSBool rgb_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->rgbClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		rgbCI *col = JS_GetPrivate(c, obj);		if (!col) return JS_FALSE;		switch (JSVAL_TO_INT(id)) {		case 0: *vp = INT_TO_JSVAL(col->r); return JS_TRUE;		case 1: *vp = INT_TO_JSVAL(col->g); return JS_TRUE;		case 2: *vp = INT_TO_JSVAL(col->b); return JS_TRUE;		default:			return JS_FALSE;		}	}	return JS_TRUE;}static JSBool rgb_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->rgbClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		rgbCI *col = JS_GetPrivate(c, obj);		if (!col) return JS_FALSE;		switch (JSVAL_TO_INT(id)) {		case 0: col->r = JSVAL_TO_INT(*vp); return JS_TRUE;		case 1: col->g = JSVAL_TO_INT(*vp); return JS_TRUE;		case 2: col->b = JSVAL_TO_INT(*vp); return JS_TRUE;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool rect_constructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	rectCI *p;	GF_SAFEALLOC(p, rectCI);	JS_SetPrivate(c, obj, p);	*rval = OBJECT_TO_JSVAL(obj);	return JS_TRUE;}static JSBool rect_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->rectClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		jsdouble *d;		rectCI *rc = JS_GetPrivate(c, obj);		if (!rc) return JS_FALSE;		if (rc->sg) {			GF_JSAPIParam par;			ScriptAction(rc->sg, GF_JSAPI_OP_GET_VIEWPORT, rc->sg->RootNode, &par);			rc->x = FIX2FLT(par.rc.x);			rc->y = FIX2FLT(par.rc.y);			rc->w = FIX2FLT(par.rc.width);			rc->h = FIX2FLT(par.rc.height);		}		switch (JSVAL_TO_INT(id)) {		case 0: d = JS_NewDouble(c, rc->x); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE;		case 1: d = JS_NewDouble(c, rc->y); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE;		case 2: d = JS_NewDouble(c, rc->w); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE;		case 3: d = JS_NewDouble(c, rc->h); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool rect_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->rectClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		jsdouble d;		rectCI *rc = JS_GetPrivate(c, obj);		if (!rc) return JS_FALSE;		JS_ValueToNumber(c, *vp, &d);		switch (JSVAL_TO_INT(id)) {		case 0: rc->x = (Float) d; return JS_TRUE;		case 1: rc->y = (Float) d; return JS_TRUE;		case 2: rc->w = (Float) d; return JS_TRUE;		case 3: rc->h = (Float) d; return JS_TRUE;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool point_constructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	pointCI *p;	GF_SAFEALLOC(p, pointCI);	JS_SetPrivate(c, obj, p);	*rval = OBJECT_TO_JSVAL(obj);	return JS_TRUE;}static JSBool point_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->pointClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		jsdouble *d;		pointCI *pt = JS_GetPrivate(c, obj);		if (!pt) return JS_FALSE;		if (pt->sg) {			GF_JSAPIParam par;			ScriptAction(pt->sg, GF_JSAPI_OP_GET_TRANSLATE, pt->sg->RootNode, &par);			pt->x = FIX2FLT(par.pt.x);			pt->y = FIX2FLT(par.pt.y);		}		switch (JSVAL_TO_INT(id)) {		case 0: d = JS_NewDouble(c, pt->x); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE;		case 1: d = JS_NewDouble(c, pt->y); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool point_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->pointClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		jsdouble d;		pointCI *pt = JS_GetPrivate(c, obj);		if (!pt) return JS_FALSE;		JS_ValueToNumber(c, *vp, &d);		switch (JSVAL_TO_INT(id)) {		case 0: pt->x = (Float) d; break;		case 1: pt->y = (Float) d; break;		default: return JS_FALSE;		}		if (pt->sg) {			GF_JSAPIParam par;			par.pt.x = FLT2FIX(pt->x);			par.pt.y = FLT2FIX(pt->y);			ScriptAction(pt->sg, GF_JSAPI_OP_SET_TRANSLATE, pt->sg->RootNode, &par);		}		return JS_TRUE;	}	return JS_TRUE;}static JSObject *svg_new_path_object(JSContext *c, SVG_PathData *d){#if USE_GF_PATH	return NULL;#else	JSObject *obj;	pathCI *p;	GF_SAFEALLOC(p, pathCI);	if (d) {		u32 i, count;		p->nb_coms = gf_list_count(d->commands);		p->tags = malloc(sizeof(u8) * p->nb_coms);		for (i=0; i<p->nb_coms; i++) p->tags[i] = * (u8 *) gf_list_get(d->commands, i);		count = gf_list_count(d->points);		p->pts = malloc(sizeof(pointCI) * count);		for (i=0; i<count; i++) {			GF_Point2D *pt = gf_list_get(d->commands, i);			p->pts[i].x = FIX2FLT(pt->x);			p->pts[i].y = FIX2FLT(pt->y);		}	}	obj = JS_NewObject(c, &svg_rt->pathClass, 0, 0);	JS_SetPrivate(c, obj, p);	return obj;#endif}static JSBool pathCI_constructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	pathCI *p;	GF_SAFEALLOC(p, pathCI);	JS_SetPrivate(c, obj, p);	*rval = OBJECT_TO_JSVAL(obj);	return JS_TRUE;}static void pathCI_finalize(JSContext *c, JSObject *obj){	pathCI *p = JS_GetPrivate(c, obj);	if (p) {		if (p->pts) free(p->pts);		if (p->tags) free(p->tags);		free(p);	}}static JSBool path_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	if (!JS_InstanceOf(c, obj, &svg_rt->pathClass, NULL) ) return JS_FALSE;	if (JSVAL_IS_INT(id)) {		pathCI *p = JS_GetPrivate(c, obj);		if (!p) return JS_FALSE;		switch (JSVAL_TO_INT(id)) {		case 0: *vp = INT_TO_JSVAL(p->nb_coms); return JS_TRUE;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool svg_path_get_segment(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *vp){	pathCI *p;	u32 idx;	if (!JS_InstanceOf(c, obj, &svg_rt->pathClass, NULL) ) return JS_FALSE;	p = JS_GetPrivate(c, obj);	if (!p) return JS_FALSE;	if ((argc!=1) || !JSVAL_IS_INT(argv[0])) return JS_FALSE;	idx = JSVAL_TO_INT(argv[0]);	if (idx>=p->nb_coms) return JS_FALSE;	switch (p->tags[idx]) {	case 0: *vp = INT_TO_JSVAL(77); return JS_TRUE;	/* Move To */	case 1: *vp = INT_TO_JSVAL(76); return JS_TRUE;	/* Line To */	case 2:/* Curve To */	case 3:/* next Curve To */		*vp = INT_TO_JSVAL(67); return JS_TRUE;		case 4:/* Quad To */	case 5:/* next Quad To */		*vp = INT_TO_JSVAL(81); return JS_TRUE;		case 6: *vp = INT_TO_JSVAL(90); return JS_TRUE;	/* Close */	}	return JS_FALSE;}static JSBool svg_path_get_segment_param(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *vp){	jsdouble *d;	pathCI *p;	ptCI *pt;	u32 i, idx, param_idx, pt_idx;	if (!JS_InstanceOf(c, obj, &svg_rt->pathClass, NULL) ) return JS_FALSE;	p = JS_GetPrivate(c, obj);	if (!p) return JS_FALSE;	if ((argc!=2) || !JSVAL_IS_INT(argv[0]) || !JSVAL_IS_INT(argv[1])) return JS_FALSE;	idx = JSVAL_TO_INT(argv[0]);	param_idx = JSVAL_TO_INT(argv[1]);	if (idx>=p->nb_coms) return JS_FALSE;	pt_idx = 0;	for (i=0; i<idx; i++) {		switch (p->tags[i]) {		case 0: pt_idx++; break;		case 1: pt_idx++; break;		case 2: pt_idx+=3; break;		case 3: pt_idx+=2; break;		case 4: pt_idx+=2; break;		case 5: pt_idx+=1; break;		}	}	switch (p->tags[idx]) {	case 0: 	case 1: 		if (param_idx>1) return JS_FALSE;		pt = &p->pts[pt_idx];		d = JS_NewDouble(c, param_idx ? pt->y : pt->x); 		*vp = DOUBLE_TO_JSVAL(d); 		return JS_TRUE;	case 2:/* Curve To */		if (param_idx>5) return JS_FALSE;		pt = &p->pts[pt_idx + (param_idx/2) ];		d = JS_NewDouble(c, (param_idx%2) ? pt->y : pt->x);		*vp = DOUBLE_TO_JSVAL(d); 		return JS_TRUE;	case 3:/* Next Curve To */		if (param_idx>5) return JS_FALSE;		if (param_idx<2) {			pt = &p->pts[pt_idx - 1];			d = JS_NewDouble(c, param_idx ? pt->y : pt->x);		} else {			param_idx-=2;			pt = &p->pts[pt_idx + (param_idx/2)];			d = JS_NewDouble(c, (param_idx%2) ? pt->y : pt->x);		}		*vp = DOUBLE_TO_JSVAL(d); 		return JS_TRUE;	case 4:/* Quad To */		if (param_idx>3) return JS_FALSE;		pt = &p->pts[pt_idx + (param_idx/2) ];		d = JS_NewDouble(c, (param_idx%2) ? pt->y : pt->x);		*vp = DOUBLE_TO_JSVAL(d); 		return JS_TRUE;	case 5:/* Next Quad To */		if (param_idx>3) return JS_FALSE;		if (param_idx<2) {			pt = &p->pts[pt_idx - 1];			d = JS_NewDouble(c, param_idx ? pt->y : pt->x);		} else {			param_idx-=2;			pt = &p->pts[pt_idx];			d = JS_NewDouble(c, param_idx ? pt->y : pt->x);		}		*vp = DOUBLE_TO_JSVAL(d); 		return JS_TRUE;		/*spec is quite obscur here*/	case 6:		d = JS_NewDouble(c, 0); 		*vp = DOUBLE_TO_JSVAL(d);  		return JS_TRUE;

⌨️ 快捷键说明

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