📄 v2.c
字号:
} else if (!strcmp("viewport-fill-opacity", att->svg_name)) { fprintf(output, "\tp->viewport_fill_opacity.type = SVG_NUMBER_VALUE;\n"); fprintf(output, "\tp->viewport_fill_opacity.value = FIX_ONE;\n"); } else if (!strcmp("visibility", att->svg_name)) { fprintf(output, "\tp->visibility = SVG_VISIBILITY_VISIBLE;\n"); } /* Initialization of complex types */ if ( !strcmp("SVG_Points", att->impl_type) || !strcmp("SVG_Coordinates", att->impl_type) || !strcmp("SMIL_KeyPoints", att->impl_type)) { fprintf(output, "\tp->%s = gf_list_new();\n", att->implementation_name); } else if (!strcmp("SVG_PathData", att->impl_type) && !strcmp(svg_elt->svg_name, "animateMotion")) { fprintf(output, "#ifdef USE_GF_PATH\n"); fprintf(output, "\tgf_path_reset(&p->path);\n"); fprintf(output, "#else\n"); fprintf(output, "\tp->path.commands = gf_list_new();\n"); fprintf(output, "\tp->path.points = gf_list_new();\n"); fprintf(output, "#endif\n"); } else if (!strcmp("SVG_PathData", att->impl_type)) { fprintf(output, "#ifdef USE_GF_PATH\n"); fprintf(output, "\tgf_path_reset(&p->d);\n"); fprintf(output, "#else\n"); fprintf(output, "\tp->d.commands = gf_list_new();\n"); fprintf(output, "\tp->d.points = gf_list_new();\n"); fprintf(output, "#endif\n"); } else if (!strcmp(att->svg_name, "lsr:enabled")) { fprintf(output, "\tp->lsr_enabled = 1;\n"); } } /*some default values*/ if (!strcmp(svg_elt->svg_name, "svg")) { fprintf(output, "\tp->width.type = SVG_NUMBER_PERCENTAGE;\n"); fprintf(output, "\tp->width.value = INT2FIX(100);\n"); fprintf(output, "\tp->height.type = SVG_NUMBER_PERCENTAGE;\n"); fprintf(output, "\tp->height.value = INT2FIX(100);\n"); } else if (!strcmp(svg_elt->svg_name, "linearGradient")) { fprintf(output, "\tp->x2.value = FIX_ONE;\n"); fprintf(output, "\tgf_mx2d_init(p->gradientTransform.mat);\n"); } else if (!strcmp(svg_elt->svg_name, "radialGradient")) { fprintf(output, "\tp->cx.value = FIX_ONE/2;\n"); fprintf(output, "\tp->cy.value = FIX_ONE/2;\n"); fprintf(output, "\tp->r.value = FIX_ONE/2;\n"); fprintf(output, "\tgf_mx2d_init(p->gradientTransform.mat);\n"); fprintf(output, "\tp->fx.value = FIX_ONE/2;\n"); fprintf(output, "\tp->fy.value = FIX_ONE/2;\n"); } else if (!strcmp(svg_elt->svg_name, "video") || !strcmp(svg_elt->svg_name, "audio") || !strcmp(svg_elt->svg_name, "animation")) { fprintf(output, "\tp->timing->dur.type = SMIL_DURATION_MEDIA;\n"); } fprintf(output, "\treturn p;\n}\n\n"); /* Destructor */ fprintf(output, "static void gf_svg_sani_%s_del(GF_Node *node)\n{\n", svg_elt->implementation_name); fprintf(output, "\tSVG_SANI_%sElement *p = (SVG_SANI_%sElement *)node;\n", svg_elt->implementation_name, svg_elt->implementation_name); fprintf(output, "\tgf_svg_sani_reset_base_element((SVG_SANI_Element *)p);\n"); if (!strcmp(svg_elt->implementation_name, "conditional")) { fprintf(output, "\tgf_svg_sa_reset_lsr_conditional(&p->updates);\n"); } else if (!strcmp(svg_elt->implementation_name, "a")) { fprintf(output, "\tif (p->target) free(p->target);\n"); } for (i = 0; i < gf_list_count(svg_elt->attributes); i++) { SVGGenAttribute *att = gf_list_get(svg_elt->attributes, i); if (!strcmp("SMIL_KeyPoints", att->impl_type)) { fprintf(output, "\tgf_smil_delete_key_types(p->%s);\n", att->implementation_name); } else if (!strcmp("SVG_Coordinates", att->impl_type)) { fprintf(output, "\tgf_svg_delete_coordinates(p->%s);\n", att->implementation_name); } else if (!strcmp("SVG_Points", att->impl_type)) { fprintf(output, "\tgf_svg_delete_points(p->%s);\n", att->implementation_name); } else if (!strcmp("SVG_PathData", att->impl_type)) { if (!strcmp(svg_elt->svg_name, "animateMotion")) { fprintf(output, "\tgf_svg_reset_path(p->path);\n"); } else { fprintf(output, "\tgf_svg_reset_path(p->d);\n"); } } else if (!strcmp("XMLRI", att->impl_type)) { fprintf(output, "\tgf_svg_reset_iri(node->sgprivate->scenegraph, &p->%s);\n", att->implementation_name); } else if (!strcmp("SVG_FontFamily", att->impl_type)) { fprintf(output, "\tif (p->%s.value) free(p->%s.value);\n", att->implementation_name, att->implementation_name); } else if (!strcmp("SVG_String", att->impl_type) || !strcmp("SVG_ContentType", att->impl_type)) { fprintf(output, "\tfree(p->%s);\n", att->implementation_name); } } if (svg_elt->has_transform) { fprintf(output, "\tif (p->motionTransform) free(p->motionTransform);\n"); } fprintf(output, "\tgf_sg_parent_reset((GF_Node *) p);\n"); fprintf(output, "\tgf_node_free((GF_Node *)p);\n"); fprintf(output, "}\n\n"); /* Attribute Access */ fprintf(output, "static GF_Err gf_svg_sani_%s_get_attribute(GF_Node *node, GF_FieldInfo *info)\n{\n", svg_elt->implementation_name); fprintf(output, "\tswitch (info->fieldIndex) {\n"); svg_elt->nb_atts = 0; svg_elt->nb_atts = generateCoreInfo(output, svg_elt, svg_elt->nb_atts); if (svg_elt->has_focus) svg_elt->nb_atts = generateGenericInfo(output, svg_elt, 4, "((SVG_SANI_Element *)node)->focus->", svg_elt->nb_atts); if (svg_elt->has_xlink) svg_elt->nb_atts = generateGenericInfo(output, svg_elt, 5, "((SVG_SANI_Element *)node)->xlink->", svg_elt->nb_atts); if (svg_elt->has_timing) svg_elt->nb_atts = generateGenericInfo(output, svg_elt, 6, "((SVG_SANI_Element *)node)->timing->", svg_elt->nb_atts); if (svg_elt->has_sync) svg_elt->nb_atts = generateGenericInfo(output, svg_elt, 7, "((SVG_SANI_Element *)node)->sync->", svg_elt->nb_atts); if (svg_elt->has_animation) svg_elt->nb_atts = generateGenericInfo(output, svg_elt, 8, "((SVG_SANI_Element *)node)->anim->", svg_elt->nb_atts); if (svg_elt->has_conditional) svg_elt->nb_atts = generateGenericInfo(output, svg_elt, 9, "((SVG_SANI_Element *)node)->conditional->", svg_elt->nb_atts); if (svg_elt->has_transform) { svg_elt->nb_atts = generateTransformInfo2(output, svg_elt, svg_elt->nb_atts); svg_elt->nb_atts = generateMotionTransformInfo2(output, svg_elt, svg_elt->nb_atts); } if (svg_elt->has_xy) svg_elt->nb_atts = generateXYInfo2(output, svg_elt, svg_elt->nb_atts); for (i = 0; i < gf_list_count(svg_elt->attributes); i++) { SVGGenAttribute *att = gf_list_get(svg_elt->attributes, i); generateAttributeInfo2(output, svg_elt->implementation_name, att, svg_elt->nb_atts++); } fprintf(output, "\t\tdefault: return GF_BAD_PARAM;\n\t}\n}\n\n");}void generateSVGCode_V2(GF_List *svg_elements) { FILE *output; u32 i; output = BeginFile(0); fprintf(output, "#include <gpac/scenegraph_svg.h>\n\n\n"); fprintf(output, "/* Definition of SVG 2 Alternate element internal tags */\n"); fprintf(output, "/* TAG names are made of \"TAG_SVG_SANI_\" + SVG element name (with - replaced by _) */\n"); /* write all tags */ fprintf(output, "enum {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); if (i == 0) { fprintf(output, "\tTAG_SVG_SANI_%s = GF_NODE_RANGE_FIRST_SVG_SANI", elt->implementation_name); } else { fprintf(output, ",\n\tTAG_SVG_SANI_%s", elt->implementation_name); } } fprintf(output, ",\n\t/*undefined elements (when parsing) use this tag*/\n\tTAG_SVG_SANI_UndefinedElement\n};\n\n"); fprintf(output, "/******************************************\n"); fprintf(output, "* SVG_SANI_ Elements structure definitions *\n"); fprintf(output, "*******************************************/\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); generateNode2(output, elt); } EndFile(output, 0); output = BeginFile(1); fprintf(output, "#include <gpac/nodes_svg_sani.h>\n\n"); fprintf(output, "#ifndef GPAC_DISABLE_SVG\n\n"); fprintf(output, "#include <gpac/internal/scenegraph_dev.h>\n\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); generateNodeImpl2(output, elt); } fprintf(output, "SVG_SANI_Element *gf_svg_sani_create_node(u32 ElementTag)\n"); fprintf(output, "{\n"); fprintf(output, "\tswitch (ElementTag) {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\t\tcase TAG_SVG_SANI_%s: return (SVG_SANI_Element*) gf_svg_sani_new_%s();\n",elt->implementation_name,elt->implementation_name); } fprintf(output, "\t\tdefault: return NULL;\n\t}\n}\n\n"); fprintf(output, "void gf_svg_sani_element_del(SVG_SANI_Element *elt)\n{\n"); fprintf(output, "\tGF_Node *node = (GF_Node *)elt;\n"); fprintf(output, "\tswitch (node->sgprivate->tag) {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\t\tcase TAG_SVG_SANI_%s: gf_svg_sani_%s_del(node); return;\n", elt->implementation_name, elt->implementation_name); } fprintf(output, "\t\tdefault: return;\n\t}\n}\n\n"); fprintf(output, "u32 gf_svg_sani_get_attribute_count(GF_Node *node)\n{\n"); fprintf(output, "\tswitch (node->sgprivate->tag) {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\t\tcase TAG_SVG_SANI_%s: return %i;\n", elt->implementation_name, elt->nb_atts); } fprintf(output, "\t\tdefault: return 0;\n\t}\n}\n\n"); fprintf(output, "GF_Err gf_svg_sani_get_attribute_info(GF_Node *node, GF_FieldInfo *info)\n{\n"); fprintf(output, "\tswitch (node->sgprivate->tag) {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\t\tcase TAG_SVG_SANI_%s: return gf_svg_sani_%s_get_attribute(node, info);\n", elt->implementation_name, elt->implementation_name); } fprintf(output, "\t\tdefault: return GF_BAD_PARAM;\n\t}\n}\n\n"); fprintf(output, "u32 gf_svg_sani_type_by_class_name(const char *element_name)\n{\n\tif (!element_name) return TAG_UndefinedNode;\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\tif (!stricmp(element_name, \"%s\")) return TAG_SVG_SANI_%s;\n", elt->svg_name, elt->implementation_name); } fprintf(output, "\treturn TAG_UndefinedNode;\n}\n\n"); fprintf(output, "const char *gf_svg_sani_get_element_name(u32 tag)\n{\n\tswitch(tag) {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\tcase TAG_SVG_SANI_%s: return \"%s\";\n", elt->implementation_name, elt->svg_name); } fprintf(output, "\tdefault: return \"UndefinedNode\";\n\t}\n}\n\n"); fprintf(output, "Bool gf_svg_sani_is_element_transformable(u32 tag)\n{\n\tswitch(tag) {\n"); for (i=0; i<gf_list_count(svg_elements); i++) { SVGGenElement *elt = (SVGGenElement *)gf_list_get(svg_elements, i); fprintf(output, "\tcase TAG_SVG_SANI_%s:", elt->implementation_name); if (elt->has_transform) fprintf(output, "return 1;\n"); else fprintf(output, "return 0;\n"); } fprintf(output, "\tdefault: return 0;\n\t}\n}\n"); fprintf(output, "#endif /*GPAC_DISABLE_SVG*/\n\n"); EndFile(output, 1); generate_laser_tables(svg_elements);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -