📄 svg_smjs.c
字号:
} break; case SVG_Paint_datatype: { SVG_Paint *paint = (SVG_Paint *)info.far_ptr; if (1 || paint->type==SVG_PAINT_COLOR) { newObj = JS_NewObject(c, &svg_rt->rgbClass, 0, 0); GF_SAFEALLOC(rgb, rgbCI); rgb->r = (u8) (255*FIX2FLT(paint->color.red) ); rgb->g = (u8) (255*FIX2FLT(paint->color.green) ); rgb->b = (u8) (255*FIX2FLT(paint->color.blue) ); JS_SetPrivate(c, newObj, rgb); *rval = OBJECT_TO_JSVAL(newObj); return JS_TRUE; } return JS_FALSE; } } return JS_FALSE;}JSBool svg_udom_set_trait(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_Err e; GF_FieldInfo info; char *val = NULL; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; if (argc==3) { char fullName[1024]; if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE; strcpy(fullName, JS_GetStringBytes(JSVAL_TO_STRING(argv[0])) ); strcat(fullName, ":"); strcat(fullName, JS_GetStringBytes(JSVAL_TO_STRING(argv[1])) ); e = gf_node_get_field_by_name(n, fullName, &info); val = JS_GetStringBytes(JSVAL_TO_STRING(argv[2])); } else if (argc==2) { e = gf_node_get_field_by_name(n, JS_GetStringBytes(JSVAL_TO_STRING(argv[0])), &info); val = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])); } else e = GF_BAD_PARAM; if (!val || (e!=GF_OK)) return JS_FALSE; *rval = JSVAL_VOID; switch (info.fieldType) { /* inheritable floats */ case SVG_FontSize_datatype: case SVG_Color_datatype: case SVG_Paint_datatype: /* inheritable float and unit */ case SVG_Length_datatype: case SVG_Coordinate_datatype: /*Number*/ case SVG_Number_datatype:/*all string traits*/ case SVG_Boolean_datatype: case SVG_FillRule_datatype: case SVG_StrokeLineJoin_datatype: case SVG_StrokeLineCap_datatype: case SVG_FontStyle_datatype: case SVG_FontWeight_datatype: case SVG_FontVariant_datatype: case SVG_TextAnchor_datatype: case SVG_Display_datatype: case SVG_Visibility_datatype: case SMIL_AttributeType_datatype: case SMIL_CalcMode_datatype: case SMIL_Additive_datatype: case SMIL_Accumulate_datatype: case SMIL_Restart_datatype: case SMIL_Fill_datatype: case SVG_GradientUnit_datatype: case SVG_PreserveAspectRatio_datatype:/*end of string traits*//*DOM string traits*/ case SVG_FontFamily_datatype: case XMLRI_datatype: case SVG_String_datatype: case SVG_ContentType_datatype: case SVG_LanguageID_datatype:/*end of DOM string traits*/ gf_svg_parse_attribute(n, &info, val, 0); svg_node_changed(n, &info); break;#if 0/*SVGT 1.2 default traits*/ case SMIL_KeyTimes_datatype: case SMIL_KeyPoints_datatype: case SMIL_KeySplines_datatype: case SVG_Coordinates_datatype: case SVG_StrokeDashArray_datatype: case SVG_Points_datatype: case SVG_Motion_datatype:/*end SVGT 1.2 default traits*//*unimplemented/unnkown/FIXME traits*/ case SMIL_SyncTolerance_datatype: case SVG_TransformType_datatype: case SVG_TransformList_datatype: case SMIL_AnimateValue_datatype: case SMIL_AnimateValues_datatype: case SMIL_AttributeName_datatype: case SMIL_Times_datatype: case SMIL_Duration_datatype: case SMIL_RepeatCount_datatype: default:/*end unimplemented/unnkown/FIXME traits*/ return JS_FALSE;#endif } return JS_TRUE;}JSBool svg_udom_set_float_trait(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_FieldInfo info; jsdouble d; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=2) return JS_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; if (!JSVAL_IS_NUMBER(argv[1])) return JS_FALSE; JS_ValueToNumber(c, argv[1], &d); *rval = JSVAL_VOID; if (gf_node_get_field_by_name(n, JS_GetStringBytes(JSVAL_TO_STRING(argv[0])), &info) != GF_OK) return JS_FALSE; switch (info.fieldType) { /* inheritable floats */ case SVG_FontSize_datatype: case SVG_Length_datatype: case SVG_Coordinate_datatype: case SVG_Number_datatype: { SVG_Number *l = (SVG_Number *)info.far_ptr; l->type=SVG_NUMBER_VALUE; l->value = FLT2FIX(d); break; } default: return JS_FALSE; } svg_node_changed(n, &info); return JS_TRUE;}JSBool svg_udom_set_matrix_trait(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *mO; char *szName; GF_FieldInfo info; GF_Matrix2D *mx; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=2) return JS_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; szName = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); if (!JSVAL_IS_OBJECT(argv[1])) return JS_FALSE; mO = JSVAL_TO_OBJECT(argv[1]); if (!JS_InstanceOf(c, mO, &svg_rt->matrixClass, NULL) ) return JS_FALSE; mx = JS_GetPrivate(c, mO); if (!mx) return JS_FALSE; if (gf_node_get_field_by_name(n, szName, &info) != GF_OK) return JS_FALSE; if (info.fieldType==SVG_Transform_datatype) { gf_mx2d_copy(((SVG_Transform*)info.far_ptr)->mat, *mx); svg_node_changed(n, NULL); return JS_TRUE; } return JS_FALSE;}JSBool svg_udom_set_rect_trait(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *rO; char *szName; GF_FieldInfo info; rectCI *rc; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=2) return JS_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; szName = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); if (!JSVAL_IS_OBJECT(argv[1])) return JS_FALSE; rO = JSVAL_TO_OBJECT(argv[1]); if (!JS_InstanceOf(c, rO, &svg_rt->rectClass, NULL) ) return JS_FALSE; rc = JS_GetPrivate(c, rO); if (!rc) return JS_FALSE; if (gf_node_get_field_by_name(n, szName, &info) != GF_OK) return JS_FALSE; if (info.fieldType==SVG_ViewBox_datatype) { SVG_ViewBox *v = (SVG_ViewBox *)info.far_ptr; v->x = FLT2FIX(rc->x); v->y = FLT2FIX(rc->y); v->width = FLT2FIX(rc->w); v->height = FLT2FIX(rc->h); svg_node_changed(n, NULL); return JS_TRUE; } return JS_FALSE;}JSBool svg_udom_set_path_trait(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ pathCI *path; GF_FieldInfo info; JSObject *pO; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=2) return JS_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; if (!JSVAL_IS_OBJECT(argv[1])) return JS_FALSE; pO = JSVAL_TO_OBJECT(argv[1]); if (!JS_InstanceOf(c, pO, &svg_rt->pathClass, NULL) ) return JS_FALSE; path = JS_GetPrivate(c, pO); if (!path) return JS_FALSE; if (gf_node_get_field_by_name(n, JS_GetStringBytes(JSVAL_TO_STRING(argv[0])), &info) != GF_OK) return JS_FALSE; if (info.fieldType==SVG_PathData_datatype) {#if USE_GF_PATH#else u32 i; u32 nb_pts; SVG_PathData *d = (SVG_PathData *)info.far_ptr; while (gf_list_count(d->commands)) { u8 *t = gf_list_get(d->commands, 0); gf_list_rem(d->commands, 0); free(t); } while (gf_list_count(d->points)) { SVG_Point *t = gf_list_get(d->points, 0); gf_list_rem(d->points, 0); free(t); } nb_pts = 0; for (i=0; i<path->nb_coms; i++) { u8 *t = malloc(sizeof(u8)); *t = path->tags[i]; gf_list_add(d->commands, t); switch (*t) { case 0: case 1: nb_pts++; break; case 2: nb_pts+=3; break; case 4: nb_pts+=2; break; } } for (i=0; i<nb_pts; i++) { SVG_Point *t = malloc(sizeof(SVG_Point)); t->x = FLT2FIX(path->pts[i].x); t->y = FLT2FIX(path->pts[i].y); gf_list_add(d->points, t); } svg_node_changed(n, NULL); return JS_TRUE;#endif } return JS_FALSE;}JSBool svg_udom_set_rgb_color_trait(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_FieldInfo info; rgbCI *rgb; JSObject *colO; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=2) return JS_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; if (!JSVAL_IS_OBJECT(argv[1])) return JS_FALSE; colO = JSVAL_TO_OBJECT(argv[1]); if (!JS_InstanceOf(c, colO, &svg_rt->rgbClass, NULL) ) return JS_FALSE; rgb = JS_GetPrivate(c, colO); if (!rgb) return JS_FALSE; *rval = JSVAL_VOID; if (gf_node_get_field_by_name(n, JS_GetStringBytes(JSVAL_TO_STRING(argv[0])), &info) != GF_OK) return JS_FALSE; switch (info.fieldType) { case SVG_Color_datatype: { SVG_Color *col = (SVG_Color *)info.far_ptr; col->type = SVG_COLOR_RGBCOLOR; col->red = FLT2FIX(rgb->r / 255.0f); col->green = FLT2FIX(rgb->g / 255.0f); col->blue = FLT2FIX(rgb->b / 255.0f); svg_node_changed(n, &info); return JS_TRUE; } case SVG_Paint_datatype: { SVG_Paint *paint = (SVG_Paint *)info.far_ptr; paint->type = SVG_PAINT_COLOR; paint->color.type = SVG_COLOR_RGBCOLOR; paint->color.red = FLT2FIX(rgb->r / 255.0f); paint->color.green = FLT2FIX(rgb->g / 255.0f); paint->color.blue = FLT2FIX(rgb->b / 255.0f); svg_node_changed(n, &info); return JS_TRUE; } } return JS_FALSE;}static JSBool svg_get_bbox(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval, Bool get_screen){ GF_JSAPIParam par; GF_Node *n = dom_get_node(c, obj, NULL); if (!n || argc) return JS_FALSE; par.bbox.is_set = 0; if (ScriptAction(n->sgprivate->scenegraph, get_screen ? GF_JSAPI_OP_GET_SCREEN_BBOX : GF_JSAPI_OP_GET_LOCAL_BBOX, (GF_Node *)n, &par) && par.bbox.is_set) { JSObject *rO = JS_NewObject(c, &svg_rt->rectClass, 0, 0); rectCI *rc = malloc(sizeof(rectCI)); rc->sg = NULL; rc->x = FIX2FLT(par.bbox.min_edge.x); /*BBox is in 3D coord system style*/ rc->y = FIX2FLT(par.bbox.min_edge.y); rc->w = FIX2FLT(par.bbox.max_edge.x - par.bbox.min_edge.x); rc->h = FIX2FLT(par.bbox.max_edge.y - par.bbox.min_edge.y); JS_SetPrivate(c, rO, rc); *rval = OBJECT_TO_JSVAL(rO); return JS_TRUE; } return JS_FALSE;}JSBool svg_udom_get_local_bbox(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return svg_get_bbox(c, obj, argc, argv, rval, 0);}JSBool svg_udom_get_screen_bbox(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return svg_get_bbox(c, obj, argc, argv, rval, 1);}JSBool svg_udom_get_screen_ctm(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_JSAPIParam par; GF_Node *n = dom_get_node(c, obj, NULL); if (!n || argc) return JS_FALSE; if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_GET_TRANSFORM, (GF_Node *)n, &par)) { JSObject *mO = JS_NewObject(c, &svg_rt->matrixClass, 0, 0); GF_Matrix2D *mx = malloc(sizeof(GF_Matrix2D)); gf_mx2d_from_mx(mx, &par.mx); JS_SetPrivate(c, mO, mx); *rval = OBJECT_TO_JSVAL(mO); return JS_TRUE; } return JS_FALSE;}JSBool svg_udom_create_matrix_components(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_Matrix2D *mx; JSObject *mat; jsdouble v; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=6) return JS_FALSE; GF_SAFEALLOC(mx, GF_Matrix2D) JS_ValueToNumber(c, argv[0], &v); mx->m[0] = FLT2FIX(v); JS_ValueToNumber(c, argv[1], &v); mx->m[3] = FLT2FIX(v); JS_ValueToNumber(c, argv[2], &v); mx->m[1] = FLT2FIX(v); JS_ValueToNumber(c, argv[3], &v); mx->m[4] = FLT2FIX(v); JS_ValueToNumber(c, argv[4], &v); mx->m[2] = FLT2FIX(v); JS_ValueToNumber(c, argv[5], &v); mx->m[5] = FLT2FIX(v); mat = JS_NewObject(c, &svg_rt->matrixClass, 0, 0); JS_SetPrivate(c, mat, mx); *rval = OBJECT_TO_JSVAL(mat); return JS_TRUE;}JSBool svg_udom_create_rect(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ rectCI *rc; JSObject *r; GF_Node *n = dom_get_node(c, obj, NULL); if (!n || argc) return JS_FALSE; GF_SAFEALLOC(rc, rectCI); r = JS_NewObject(c, &svg_rt->rectClass, 0, 0); JS_SetPrivate(c, r, rc); *rval = OBJECT_TO_JSVAL(r); return JS_TRUE;}JSBool svg_udom_create_path(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ pathCI *path; JSObject *p; GF_Node *n = dom_get_node(c, obj, NULL); if (!n || argc) return JS_FALSE; GF_SAFEALLOC(path, pathCI); p = JS_NewObject(c, &svg_rt->pathClass, 0, 0); JS_SetPrivate(c, p, path); *rval = OBJECT_TO_JSVAL(p); return JS_TRUE;}JSBool svg_udom_create_color(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ rgbCI *col; JSObject *p; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if (argc!=3) return JS_FALSE; GF_SAFEALLOC(col, rgbCI); col->r = JSVAL_TO_INT(argv[0]); col->g = JSVAL_TO_INT(argv[1]); col->b = JSVAL_TO_INT(argv[2]); p = JS_NewObject(c, &svg_rt->rgbClass, 0, 0); JS_SetPrivate(c, p, col); *rval = OBJECT_TO_JSVAL(p); return JS_TRUE;}JSBool svg_udom_move_focus(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_JSAPIParam par; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if ((argc!=1) || !JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; par.opt = JSVAL_TO_INT(argv[1]); if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_SET_FOCUS, (GF_Node *)n, &par)) return JS_TRUE; return JS_FALSE;}JSBool svg_udom_set_focus(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_JSAPIParam par; GF_Node *n = dom_get_node(c, obj, NULL); if (!n) return JS_FALSE; if ((argc!=1) || !JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; par.node = dom_get_node(c, JSVAL_TO_OBJECT(argv[0]), NULL); /*NOT IN THE GRAPH*/ if (!par.node || !par.node->sgprivate->num_instances) return JS_FALSE; if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_SET_FOCUS, (GF_Node *)n, &par)) return JS_TRUE; return JS_FALSE;}JSBool svg_udom_get_focus(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_JSAPIParam par; GF_Node *n = dom_get_node(c, obj, NULL); if (!n || argc) return JS_FALSE; *rval = JSVAL_VOID; if (!ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_GET_FOCUS, (GF_Node *)n, &par)) return JS_FALSE; if (par.node) { *rval = dom_element_construct(c, par.node); } return JS_TRUE;}JSBool svg_udom_get_property(JSContext *c, GF_Node *_n, u32 svg_prop_id, jsval *vp){ GF_JSAPIParam par; jsdouble *d; JSString *s; SVG_Element *n = (SVG_Element*)_n; switch (svg_prop_id) { /*id*/ case 0: { const char *node_name = gf_node_get_name((GF_Node*)n); if (node_name) { s = JS_NewStringCopyZ(c, node_name); *vp = STRING_TO_JSVAL( s ); return JS_TRUE; } return JS_FALSE; } /*currentScale*/ case 1: if (n->sgprivate->tag!=TAG_SVG_svg) return JS_FALSE; if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_GET_SCALE, (GF_Node *)n, &par)) { d = JS_NewDouble(c, FIX2FLT(par.val) ); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE; } return JS_FALSE; /*currentRotate*/ case 2: if (n->sgprivate->tag!=TAG_SVG_svg) return JS_FALSE; if (ScriptAction(n->sgprivate->scenegraph, GF_JSAPI_OP_GET_ROTATION, (GF_Node *)n, &par)) { d = JS_NewDouble(c, FIX2FLT(par.val) ); *vp = DOUBLE_TO_JSVAL(d); return JS_TRUE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -