📄 svg_tools_da.c
字号:
case SVG_Length_datatype: if (info->fieldIndex == TAG_SVG_ATT_stroke_dashoffset) return GF_SG_SVG_STROKEDASHOFFSET_DIRTY; if (info->fieldIndex == TAG_SVG_ATT_stroke_width) return GF_SG_SVG_STROKEWIDTH_DIRTY; break; case SVG_DisplayAlign_datatype: return GF_SG_SVG_DISPLAYALIGN_DIRTY; case SVG_FillRule_datatype: return GF_SG_SVG_FILLRULE_DIRTY; case SVG_FontFamily_datatype: return GF_SG_SVG_FONTFAMILY_DIRTY; case SVG_FontSize_datatype: return GF_SG_SVG_FONTSIZE_DIRTY; case SVG_FontStyle_datatype: return GF_SG_SVG_FONTSTYLE_DIRTY; case SVG_FontVariant_datatype: return GF_SG_SVG_FONTVARIANT_DIRTY; case SVG_FontWeight_datatype: return GF_SG_SVG_FONTWEIGHT_DIRTY; case SVG_StrokeDashArray_datatype: return GF_SG_SVG_STROKEDASHARRAY_DIRTY; case SVG_StrokeLineCap_datatype: return GF_SG_SVG_STROKELINECAP_DIRTY; case SVG_StrokeLineJoin_datatype: return GF_SG_SVG_STROKELINEJOIN_DIRTY; case SVG_TextAlign_datatype: return GF_SG_SVG_TEXTALIGN_DIRTY; case SVG_TextAnchor_datatype: return GF_SG_SVG_TEXTANCHOR_DIRTY; case SVG_VectorEffect_datatype: return GF_SG_SVG_VECTOREFFECT_DIRTY; } /* this is not a property but a regular attribute, the animatable attributes are at the moment: focusable, focusHighlight, gradientUnits, nav-*, target, xlink:href, xlink:type, the following affect the geometry of the element (some affect the positioning): cx, cy, d, height, offset, pathLength, points, r, rx, ry, width, x, x1, x2, y, y1, y2, rotate the following affect the positioning and are computed at each frame: transform, viewBox, preserveAspectRatio */ switch (info->fieldType) { case SVG_Number_datatype: case SVG_Length_datatype: case SVG_Coordinate_datatype: case SVG_Numbers_datatype: case SVG_Points_datatype: case SVG_Coordinates_datatype: case SVG_PathData_datatype: case SVG_Rotate_datatype: return GF_SG_SVG_GEOMETRY_DIRTY; case XMLRI_datatype: return GF_SG_NODE_DIRTY; //case SVG_Matrix_datatype: //case SVG_Motion_datatype: //case SVG_ViewBox_datatype: default: return 0; }}/* NOTE: Some properties (audio-level, display, opacity, solid*, stop*, vector-effect, viewport*) are inherited only when they are specified with the value 'inherit' otherwise they default to their initial value which for the function below means NULL, the renderer will take care of the rest */GF_EXPORTu32 gf_svg_apply_inheritance(SVGAllAttributes *all_atts, SVGPropertiesPointers *render_svg_props) { u32 inherited_flags_mask = GF_SG_NODE_DIRTY | GF_SG_CHILD_DIRTY; if(!all_atts || !render_svg_props) return ~inherited_flags_mask; if (all_atts->audio_level && all_atts->audio_level->type != SVG_NUMBER_INHERIT) { render_svg_props->audio_level = all_atts->audio_level; } else if (!all_atts->audio_level) { render_svg_props->audio_level = NULL; } if (all_atts->color && all_atts->color->color.type != SVG_COLOR_INHERIT) { render_svg_props->color = all_atts->color; } else { inherited_flags_mask |= GF_SG_SVG_COLOR_DIRTY; } if (all_atts->color_rendering && *(all_atts->color_rendering) != SVG_RENDERINGHINT_INHERIT) { render_svg_props->color_rendering = all_atts->color_rendering; } if (all_atts->display && *(all_atts->display) != SVG_DISPLAY_INHERIT) { render_svg_props->display = all_atts->display; } else if (!all_atts->display) { render_svg_props->display = NULL; } if (all_atts->display_align && *(all_atts->display_align) != SVG_DISPLAYALIGN_INHERIT) { render_svg_props->display_align = all_atts->display_align; } else { inherited_flags_mask |= GF_SG_SVG_DISPLAYALIGN_DIRTY; } if (all_atts->fill && all_atts->fill->type != SVG_PAINT_INHERIT) { render_svg_props->fill = all_atts->fill; if (all_atts->fill->type == SVG_PAINT_COLOR && all_atts->fill->color.type == SVG_COLOR_CURRENTCOLOR && (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY)) { inherited_flags_mask |= GF_SG_SVG_FILL_DIRTY; } } else { inherited_flags_mask |= GF_SG_SVG_FILL_DIRTY; } if (all_atts->fill_opacity && all_atts->fill_opacity->type != SVG_NUMBER_INHERIT) { render_svg_props->fill_opacity = all_atts->fill_opacity; } else { inherited_flags_mask |= GF_SG_SVG_FILLOPACITY_DIRTY; } if (all_atts->fill_rule && *(all_atts->fill_rule) != SVG_FILLRULE_INHERIT) { render_svg_props->fill_rule = all_atts->fill_rule; } else { inherited_flags_mask |= GF_SG_SVG_FILLRULE_DIRTY; } if (all_atts->font_family && all_atts->font_family->type != SVG_FONTFAMILY_INHERIT) { render_svg_props->font_family = all_atts->font_family; } else { inherited_flags_mask |= GF_SG_SVG_FONTFAMILY_DIRTY; } if (all_atts->font_size && all_atts->font_size->type != SVG_NUMBER_INHERIT) { render_svg_props->font_size = all_atts->font_size; } else { inherited_flags_mask |= GF_SG_SVG_FONTSIZE_DIRTY; } if (all_atts->font_style && *(all_atts->font_style) != SVG_FONTSTYLE_INHERIT) { render_svg_props->font_style = all_atts->font_style; } else { inherited_flags_mask |= GF_SG_SVG_FONTSTYLE_DIRTY; } if (all_atts->font_variant && *(all_atts->font_variant) != SVG_FONTVARIANT_INHERIT) { render_svg_props->font_variant = all_atts->font_variant; } else { inherited_flags_mask |= GF_SG_SVG_FONTVARIANT_DIRTY; } if (all_atts->font_weight && *(all_atts->font_weight) != SVG_FONTWEIGHT_INHERIT) { render_svg_props->font_weight = all_atts->font_weight; } else { inherited_flags_mask |= GF_SG_SVG_FONTWEIGHT_DIRTY; } if (all_atts->image_rendering && *(all_atts->image_rendering) != SVG_RENDERINGHINT_INHERIT) { render_svg_props->image_rendering = all_atts->image_rendering; } if (all_atts->line_increment && all_atts->line_increment->type != SVG_NUMBER_INHERIT) { render_svg_props->line_increment = all_atts->line_increment; } else { inherited_flags_mask |= GF_SG_SVG_LINEINCREMENT_DIRTY; } if (all_atts->opacity && all_atts->opacity->type != SVG_NUMBER_INHERIT) { render_svg_props->opacity = all_atts->opacity; } else if (!all_atts->opacity) { render_svg_props->opacity = NULL; } else { inherited_flags_mask |= GF_SG_SVG_OPACITY_DIRTY; } if (all_atts->pointer_events && *(all_atts->pointer_events) != SVG_POINTEREVENTS_INHERIT) { render_svg_props->pointer_events = all_atts->pointer_events; } if (all_atts->shape_rendering && *(all_atts->shape_rendering) != SVG_RENDERINGHINT_INHERIT) { render_svg_props->shape_rendering = all_atts->shape_rendering; } if (all_atts->solid_color && all_atts->solid_color->type != SVG_PAINT_INHERIT) { render_svg_props->solid_color = all_atts->solid_color; if (all_atts->solid_color->type == SVG_PAINT_COLOR && all_atts->solid_color->color.type == SVG_COLOR_CURRENTCOLOR && (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY)) { inherited_flags_mask |= GF_SG_SVG_SOLIDCOLOR_DIRTY; } } else if (!all_atts->solid_color) { render_svg_props->solid_color = NULL; } else { inherited_flags_mask |= GF_SG_SVG_SOLIDCOLOR_DIRTY; } if (all_atts->solid_opacity && all_atts->solid_opacity->type != SVG_NUMBER_INHERIT) { render_svg_props->solid_opacity = all_atts->solid_opacity; } else if (!all_atts->solid_opacity) { render_svg_props->solid_opacity = NULL; } else { inherited_flags_mask |= GF_SG_SVG_SOLIDOPACITY_DIRTY; } if (all_atts->stop_color && all_atts->stop_color->type != SVG_PAINT_INHERIT) { render_svg_props->stop_color = all_atts->stop_color; if (all_atts->stop_color->type == SVG_PAINT_COLOR && all_atts->stop_color->color.type == SVG_COLOR_CURRENTCOLOR && (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY)) { inherited_flags_mask |= GF_SG_SVG_STOPCOLOR_DIRTY; } } else if (!all_atts->stop_color) { render_svg_props->stop_color = NULL; } else { inherited_flags_mask |= GF_SG_SVG_STOPCOLOR_DIRTY; } if (all_atts->stop_opacity && all_atts->stop_opacity->type != SVG_NUMBER_INHERIT) { render_svg_props->stop_opacity = all_atts->stop_opacity; } else if (!all_atts->stop_opacity) { render_svg_props->stop_opacity = NULL; } else { inherited_flags_mask |= GF_SG_SVG_STOPOPACITY_DIRTY; } if (all_atts->stroke && all_atts->stroke->type != SVG_PAINT_INHERIT) { render_svg_props->stroke = all_atts->stroke; if (all_atts->stroke->type == SVG_PAINT_COLOR && all_atts->stroke->color.type == SVG_COLOR_CURRENTCOLOR && (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY)) { inherited_flags_mask |= GF_SG_SVG_STROKE_DIRTY; } } else { inherited_flags_mask |= GF_SG_SVG_STROKE_DIRTY; } if (all_atts->stroke_dasharray && all_atts->stroke_dasharray->type != SVG_STROKEDASHARRAY_INHERIT) { render_svg_props->stroke_dasharray = all_atts->stroke_dasharray; } else { inherited_flags_mask |= GF_SG_SVG_STROKEDASHARRAY_DIRTY; } if (all_atts->stroke_dashoffset && all_atts->stroke_dashoffset->type != SVG_NUMBER_INHERIT) { render_svg_props->stroke_dashoffset = all_atts->stroke_dashoffset; } else { inherited_flags_mask |= GF_SG_SVG_STROKEDASHOFFSET_DIRTY; } if (all_atts->stroke_linecap && *(all_atts->stroke_linecap) != SVG_STROKELINECAP_INHERIT) { render_svg_props->stroke_linecap = all_atts->stroke_linecap; } else { inherited_flags_mask |= GF_SG_SVG_STROKELINECAP_DIRTY; } if (all_atts->stroke_linejoin && *(all_atts->stroke_linejoin) != SVG_STROKELINEJOIN_INHERIT) { render_svg_props->stroke_linejoin = all_atts->stroke_linejoin; } else { inherited_flags_mask |= GF_SG_SVG_STROKELINEJOIN_DIRTY; } if (all_atts->stroke_miterlimit && all_atts->stroke_miterlimit->type != SVG_NUMBER_INHERIT) { render_svg_props->stroke_miterlimit = all_atts->stroke_miterlimit; } else { inherited_flags_mask |= GF_SG_SVG_STROKEMITERLIMIT_DIRTY; } if (all_atts->stroke_opacity && all_atts->stroke_opacity->type != SVG_NUMBER_INHERIT) { render_svg_props->stroke_opacity = all_atts->stroke_opacity; } else { inherited_flags_mask |= GF_SG_SVG_STROKEOPACITY_DIRTY; } if (all_atts->stroke_width && all_atts->stroke_width->type != SVG_NUMBER_INHERIT) { render_svg_props->stroke_width = all_atts->stroke_width; } else { inherited_flags_mask |= GF_SG_SVG_STROKEWIDTH_DIRTY; } if (all_atts->text_align && *(all_atts->text_align) != SVG_TEXTALIGN_INHERIT) { render_svg_props->text_align = all_atts->text_align; } else { inherited_flags_mask |= GF_SG_SVG_TEXTALIGN_DIRTY; } if (all_atts->text_anchor && *(all_atts->text_anchor) != SVG_TEXTANCHOR_INHERIT) { render_svg_props->text_anchor = all_atts->text_anchor; } else { inherited_flags_mask |= GF_SG_SVG_TEXTANCHOR_DIRTY; } if (all_atts->text_rendering && *(all_atts->text_rendering) != SVG_RENDERINGHINT_INHERIT) { render_svg_props->text_rendering = all_atts->text_rendering; } if (all_atts->vector_effect && *(all_atts->vector_effect) != SVG_VECTOREFFECT_INHERIT) { render_svg_props->vector_effect = all_atts->vector_effect; } else if (!all_atts->vector_effect) { render_svg_props->vector_effect = NULL; } else { inherited_flags_mask |= GF_SG_SVG_VECTOREFFECT_DIRTY; } if (all_atts->viewport_fill && all_atts->viewport_fill->type != SVG_PAINT_INHERIT) { render_svg_props->viewport_fill = all_atts->viewport_fill; } else if (!all_atts->viewport_fill) { render_svg_props->viewport_fill = NULL; } if (all_atts->viewport_fill_opacity && all_atts->viewport_fill_opacity->type != SVG_NUMBER_INHERIT) { render_svg_props->viewport_fill_opacity = all_atts->viewport_fill_opacity; } else if (!all_atts->viewport_fill_opacity) { render_svg_props->viewport_fill_opacity = NULL; } if (all_atts->visibility && *(all_atts->visibility) != SVG_VISIBILITY_INHERIT) { render_svg_props->visibility = all_atts->visibility; } return inherited_flags_mask;}static GF_Err gf_node_deactivate_ex(GF_Node *node){#ifdef GPAC_DISABLE_SVG return GF_NOT_SUPPORTED;#else GF_Node *obs; GF_ChildNodeItem *item; if (node->sgprivate->tag<GF_NODE_FIRST_DOM_NODE_TAG) return GF_BAD_PARAM; if (! (node->sgprivate->flags & GF_NODE_IS_DEACTIVATED)) { /*deactivate anmiations*/ if (gf_svg_is_timing_tag(node->sgprivate->tag)) { SVGTimedAnimBaseElement *timed = (SVGTimedAnimBaseElement*)node; if (gf_list_del_item(node->sgprivate->scenegraph->smil_timed_elements, timed->timingp->runtime)>=0) { if (timed->timingp->runtime->evaluate) { timed->timingp->runtime->evaluate(timed->timingp->runtime, 0, SMIL_TIMING_EVAL_DEACTIVATE); } } } /*unregister all listeners*/ switch (node->sgprivate->tag) {#ifdef GPAC_ENABLE_SVG_SA case TAG_SVG_SA_listener:#endif#ifdef GPAC_ENABLE_SVG_SANI case TAG_SVG_SANI_listener:#endif case TAG_SVG_listener: assert(node->sgprivate->UserPrivate); obs = node->sgprivate->UserPrivate; assert(obs->sgprivate->interact && obs->sgprivate->interact->events); gf_list_del_item(obs->sgprivate->interact->events, node); break; } node->sgprivate->flags |= GF_NODE_IS_DEACTIVATED; } /*and deactivate children*/ item = ((GF_ParentNode*)node)->children; while (item) { gf_node_deactivate_ex(item->node); item = item->next; } return GF_OK;#endif}GF_Err gf_node_deactivate(GF_Node *node){ GF_Err e = gf_node_deactivate_ex(node); gf_node_changed(node, NULL); return e;}static GF_Err gf_node_activate_ex(GF_Node *node){#ifdef GPAC_DISABLE_SVG return GF_NOT_SUPPORTED;#else GF_Node *obs; GF_ChildNodeItem *item; if (node->sgprivate->tag<GF_NODE_FIRST_DOM_NODE_TAG) return GF_BAD_PARAM; if (node->sgprivate->flags & GF_NODE_IS_DEACTIVATED) { /*deactivate anmiations*/ if (gf_svg_is_timing_tag(node->sgprivate->tag)) { SVGTimedAnimBaseElement *timed = (SVGTimedAnimBaseElement*)node; gf_list_add(node->sgprivate->scenegraph->smil_timed_elements, timed->timingp->runtime); node->sgprivate->flags &= ~GF_NODE_IS_DEACTIVATED; if (timed->timingp->runtime->evaluate) { timed->timingp->runtime->evaluate(timed->timingp->runtime, 0, SMIL_TIMING_EVAL_ACTIVATE); } } /*register all listeners*/ switch (node->sgprivate->tag) {#ifdef GPAC_ENABLE_SVG_SA case TAG_SVG_SA_listener:#endif#ifdef GPAC_ENABLE_SVG_SANI case TAG_SVG_SANI_listener:#endif case TAG_SVG_listener: assert(node->sgprivate->UserPrivate); obs = node->sgprivate->UserPrivate; node->sgprivate->UserPrivate = NULL; gf_dom_listener_post_add(obs, node); break; } node->sgprivate->flags &= ~GF_NODE_IS_DEACTIVATED; } /*and deactivate children*/ item = ((GF_ParentNode*)node)->children; while (item) { gf_node_activate_ex(item->node); item = item->next; } return GF_OK;#endif}GF_Err gf_node_activate(GF_Node *node){ GF_Err e = gf_node_activate_ex(node); gf_node_changed(node, NULL); return e;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -