📄 svg_smjs.c
字号:
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 + -