--- /dev/null
+/*\r
+ * GPAC - Multimedia Framework C SDK\r
+ *\r
+ * Copyright (c) Cyril Concolato 2004\r
+ * All rights reserved\r
+ *\r
+ * This file is part of GPAC / SVG Scene Graph sub-project\r
+ *\r
+ * GPAC is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU Lesser General Public License as published by\r
+ * the Free Software Foundation; either version 2, or (at your option)\r
+ * any later version.\r
+ * \r
+ * GPAC is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU Lesser General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; see the file COPYING. If not, write to\r
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. \r
+ *\r
+ */\r
+\r
+#ifndef _GF_SG_SVG_H_\r
+#define _GF_SG_SVG_H_\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#include <gpac/scenegraph.h>\r
+#include <gpac/svg_types.h>\r
+\r
+/*******************************************************************************\r
+ * \r
+ * DOM base scene graph\r
+ *\r
+ *******************************************************************************/\r
+\r
+enum\r
+{\r
+ /*should never be used, this is only a parsing error*/\r
+ TAG_DOM_ATTRIBUTE_NULL,\r
+ /*this tag is set for a full dom attribute only - attribute name is then available*/\r
+ TAG_DOM_ATT_any,\r
+\r
+ TAG_XML_ATT_RANGE_FIRST,\r
+ TAG_XML_ATT_id = TAG_XML_ATT_RANGE_FIRST,\r
+ TAG_XML_ATT_base,\r
+ TAG_XML_ATT_lang,\r
+ TAG_XML_ATT_space,\r
+ TAG_XML_ATT_RANGE_LAST,\r
+ TAG_XLINK_ATT_RANGE_FIRST,\r
+\r
+ TAG_XLINK_ATT_type = TAG_XLINK_ATT_RANGE_FIRST,\r
+ TAG_XLINK_ATT_role,\r
+ TAG_XLINK_ATT_arcrole,\r
+ TAG_XLINK_ATT_title,\r
+ TAG_XLINK_ATT_href,\r
+ TAG_XLINK_ATT_show,\r
+ TAG_XLINK_ATT_actuate,\r
+ TAG_XLINK_ATT_RANGE_LAST,\r
+\r
+ TAG_XMLEV_ATT_RANGE_FIRST,\r
+ TAG_XMLEV_ATT_event,\r
+ TAG_XMLEV_ATT_phase,\r
+ TAG_XMLEV_ATT_propagate,\r
+ TAG_XMLEV_ATT_defaultAction,\r
+ TAG_XMLEV_ATT_observer,\r
+ TAG_XMLEV_ATT_target,\r
+ TAG_XMLEV_ATT_handler,\r
+ TAG_XMLEV_ATT_RANGE_LAST,\r
+\r
+ TAG_LSR_ATT_RANGE_FIRST,\r
+ TAG_LSR_ATT_enabled,\r
+ TAG_LSR_ATT_RANGE_LAST,\r
+ /*these attribute types are only use for binary purpose*/\r
+ TAG_LSR_ATT_children,\r
+ TAG_LSR_ATT_overflow,\r
+ TAG_LSR_ATT_rotation,\r
+ TAG_LSR_ATT_scale,\r
+ TAG_LSR_ATT_translation,\r
+ TAG_LSR_ATT_svg_width,\r
+ TAG_LSR_ATT_svg_height,\r
+ TAG_LSR_ATT_textContent,\r
+ /*WHAT THE HECK IS THIS THING IN THE SDL BUT NOWHERE IN THE SPEC ?*/\r
+ TAG_LSR_ATT_text_display,\r
+\r
+ TAG_SVG_ATT_RANGE_FIRST,\r
+\r
+ TAG_XBL_ATT_RANGE_FIRST = TAG_SVG_ATT_RANGE_FIRST + 256,\r
+ TAG_XBL_ATT_id = TAG_XBL_ATT_RANGE_FIRST,\r
+ TAG_XBL_ATT_extends,\r
+ TAG_XBL_ATT_display,\r
+ TAG_XBL_ATT_inheritstyle,\r
+ TAG_XBL_ATT_includes,\r
+ TAG_XBL_ATT_name,\r
+ TAG_XBL_ATT_implements,\r
+ TAG_XBL_ATT_type,\r
+ TAG_XBL_ATT_readonly,\r
+ TAG_XBL_ATT_onget,\r
+ TAG_XBL_ATT_onset,\r
+ TAG_XBL_ATT_event,\r
+ TAG_XBL_ATT_action,\r
+ TAG_XBL_ATT_phase,\r
+ TAG_XBL_ATT_button,\r
+ TAG_XBL_ATT_modifiers,\r
+ TAG_XBL_ATT_keycode,\r
+ TAG_XBL_ATT_key,\r
+ TAG_XBL_ATT_charcode,\r
+ TAG_XBL_ATT_clickcount,\r
+ TAG_XBL_ATT_command,\r
+ TAG_XBL_ATT_preventdefault,\r
+ TAG_XBL_ATT_src,\r
+};\r
+\r
+\r
+#define GF_DOM_BASE_ATTRIBUTE \\r
+ u16 tag; /*attribute identifier*/ \\r
+ u16 data_type; /*attribute datatype*/ \\r
+ void *data; /*data pointer*/ \\r
+ struct __dom_base_attribute *next; /*next attribute*/\r
+\r
+#define GF_DOM_FULL_ATTRIBUTE \\r
+ GF_DOM_ATTRIBUTE \\r
+\r
+typedef struct __dom_base_attribute\r
+{\r
+ GF_DOM_BASE_ATTRIBUTE\r
+} GF_DOMAttribute;\r
+\r
+typedef struct __dom_full_attribute\r
+{\r
+ GF_DOM_BASE_ATTRIBUTE\r
+ u32 xmlns;\r
+ char *name; /*attribute name - in this case, the data field is the attribute literal value*/\r
+} GF_DOMFullAttribute;\r
+\r
+#define GF_DOM_BASE_NODE \\r
+ BASE_NODE \\r
+ CHILDREN \\r
+ GF_DOMAttribute *attributes;\r
+\r
+typedef struct __dom_base_node\r
+{\r
+ GF_DOM_BASE_NODE\r
+} GF_DOMNode;\r
+\r
+typedef struct __dom_full_node\r
+{\r
+ GF_DOM_BASE_NODE\r
+ char *name;\r
+ u32 ns;\r
+} GF_DOMFullNode;\r
+\r
+\r
+\r
+enum\r
+{\r
+ /*no NS specified, it will be evaluated from attribute/node name*/\r
+ GF_XMLNS_NONE,\r
+\r
+ GF_XMLNS_XML,\r
+ GF_XMLNS_XLINK,\r
+ GF_XMLNS_XMLEV,\r
+ GF_XMLNS_LASER,\r
+ GF_XMLNS_SVG,\r
+ GF_XMLNS_XBL,\r
+\r
+ /*any other namespace uses the CRC32 of the namespace as an identifier*/\r
+};\r
+\r
+GF_Err gf_sg_add_namespace(GF_SceneGraph *sg, char *name, char *qname);\r
+GF_Err gf_sg_remove_namespace(GF_SceneGraph *sg, char *name, char *qname);\r
+u32 gf_sg_get_namespace_code(GF_SceneGraph *sg, char *qname);\r
+u32 gf_sg_get_namespace_code_from_name(GF_SceneGraph *sg, char *name);\r
+const char *gf_sg_get_namespace_qname(GF_SceneGraph *sg, u32 xmlns_id);\r
+\r
+u32 gf_xml_get_element_namespace(GF_Node *n);\r
+const char *gf_sg_get_namespace(GF_SceneGraph *sg, u32 xmlns_id);\r
+\r
+void gf_xml_push_namespaces(GF_DOMNode *elt);\r
+void gf_xml_pop_namespaces(GF_DOMNode *elt);\r
+\r
+\r
+\r
+\r
+enum\r
+{\r
+ GF_DOM_TEXT_REGULAR = 0,\r
+ GF_DOM_TEXT_CDATA,\r
+ /*inserted text node (typically external script)*/\r
+ GF_DOM_TEXT_INSERTED\r
+};\r
+\r
+typedef struct\r
+{\r
+ BASE_NODE\r
+ CHILDREN\r
+ char *textContent;\r
+ u32 type;\r
+} GF_DOMText;\r
+\r
+/*creates a new text node, assign string (does NOT duplicate it) and register node with parent if desired*/\r
+GF_DOMText *gf_dom_add_text_node(GF_Node *parent, char *text_data);\r
+\r
+/*creates a new text node - this DOES NOT register the node at all*/\r
+GF_DOMText *gf_dom_new_text_node(GF_SceneGraph *sg);\r
+\r
+typedef struct\r
+{\r
+ BASE_NODE\r
+ CHILDREN\r
+ char *data;\r
+ u32 data_size;\r
+ GF_List *updates;\r
+} GF_DOMUpdates;\r
+\r
+/*creates a new updates node and register node with parent*/\r
+GF_DOMUpdates *gf_dom_add_updates_node(GF_Node *parent);\r
+\r
+typedef struct\r
+{\r
+ Bool bufferValid;\r
+ u32 level;\r
+ Fixed remaining_time;\r
+ u16 status;\r
+ const char *session_name;\r
+ u32 nb_streams;\r
+ struct mae_item {u32 streamType; u32 mediaType; u32 transport; } streams[20];\r
+} GF_DOMMediaAccessEvent;\r
+\r
+/* \r
+ DOM event handling\r
+*/\r
+enum\r
+{\r
+ GF_DOM_EVENT_PHASE_CAPTURE = 1,\r
+ GF_DOM_EVENT_PHASE_AT_TARGET = 2,\r
+ GF_DOM_EVENT_PHASE_BUBBLE = 3,\r
+\r
+ /*special phase indicating the event has been canceled*/\r
+ GF_DOM_EVENT_PHASE_CANCEL = 1<<5,\r
+ /*special phase indicating the event has been canceled immediately*/\r
+ GF_DOM_EVENT_PHASE_CANCEL_ALL = 1<<6,\r
+ /*special phase indicating the default action of the event is prevented*/\r
+ GF_DOM_EVENT_PHASE_PREVENT = 1<<7,\r
+};\r
+\r
+/*possible event targets*/\r
+enum\r
+{\r
+ GF_DOM_EVENT_NODE,\r
+ GF_DOM_EVENT_DOCUMENT,\r
+ GF_DOM_EVENT_XHR,\r
+ GF_DOM_EVENT_TIMER,\r
+ GF_DOM_EVENT_CONNECTION,\r
+};\r
+\r
+typedef struct \r
+{\r
+ GF_List *evt_list;\r
+ void *ptr;\r
+ u32 ptr_type;\r
+} GF_DOMEventTarget;\r
+\r
+GF_Err gf_dom_listener_add(GF_Node *listener, GF_DOMEventTarget *evt_target);\r
+\r
+\r
+typedef struct\r
+{\r
+ /*event type, as defined in <gpac/events.h>*/\r
+ u32 type;\r
+ /*event phase type, READ-ONLY\r
+ 0: at target, 1: bubbling, 2: capturing , 3: canceled\r
+ */\r
+ u8 event_phase;\r
+ u8 bubbles;\r
+ u8 cancelable;\r
+ /*output only - indicates UI events (mouse) have been detected*/\r
+ u8 has_ui_events;\r
+ \r
+ /*we don't use a GF_DOMEventTarget here since the structure is only created when events are attached */\r
+ void *target;\r
+ u32 target_type;\r
+\r
+ GF_DOMEventTarget *currentTarget;\r
+ Double timestamp;\r
+ /*UIEvent extension. \r
+ For mouse extensions: number of clicks \r
+ For key event: the key code\r
+ For SMIL event: number of iteration (repeat)\r
+ */\r
+ u32 detail;\r
+\r
+ /*MouseEvent extension*/\r
+ s32 screenX, screenY;\r
+ s32 clientX, clientY;\r
+ u32 button;\r
+ /*key flags*/\r
+ u32 key_flags;\r
+ /*key hardware code*/\r
+ u32 key_hw_code;\r
+ GF_Node *relatedTarget;\r
+ /*Zoom event*/\r
+ GF_Rect screen_rect;\r
+ GF_Point2D prev_translate, new_translate;\r
+ Fixed prev_scale, new_scale;\r
+ /* CPU */\r
+ u32 cpu_percentage;\r
+ /* Battery */\r
+ Bool onBattery;\r
+ u32 batteryState, batteryLevel;\r
+ /*smil event time*/\r
+ Double smil_event_time;\r
+ /* mutation event */\r
+ GF_Node *relatedNode;\r
+\r
+ /*DOM event used in VRML (GPAC's internal)*/\r
+ Bool is_vrml;\r
+ GF_DOMMediaAccessEvent *mae;\r
+\r
+ /*number of listeners triggered by the event*/\r
+ u32 consumed;\r
+} GF_DOM_Event;\r
+\r
+/*fires event on the specified node\r
+BE CAREFULL: event execution may very well destroy ANY node, especially the event target node !!\r
+*/\r
+Bool gf_dom_event_fire(GF_Node *node, GF_DOM_Event *event);\r
+\r
+/*fires event on the specified node\r
+BE CAREFULL: event execution may very well destroy ANY node, especially the event target node !!\r
+use_stack: a list of parent node/use node pairs for bubbling phase - may be NULL\r
+*/\r
+Bool gf_dom_event_fire_ex(GF_Node *node, GF_DOM_Event *event, GF_List *use_stack);\r
+\r
+u32 gf_dom_event_type_by_name(const char *name);\r
+const char *gf_dom_event_get_name(u32 type);\r
+\r
+const char *gf_dom_get_key_name(u32 key_identifier);\r
+u32 gf_dom_get_key_type(char *key_name);\r
+\r
+\r
+/*listener is simply a node added to the node events list. \r
+Only one observer can be attached to a listener. The listener will remove itself from the observer\r
+event list when destructed.*/\r
+\r
+typedef struct __xml_ev_handler \r
+{\r
+ GF_DOM_BASE_NODE\r
+ void (*handle_event)(GF_Node *hdl, GF_DOM_Event *event, GF_Node *observer);\r
+ /*if handler targets a VRML script, point to the script here*/\r
+ void *js_context;\r
+ /*target EventListener object (this) */\r
+ void *evt_listen_obj;\r
+ /*function value for spidermonkey - we cannot use JS_CallFunction since it does not work on closures\r
+ we use 64 bits to store the value for portability safety*/\r
+ u64 js_fun_val;\r
+ /*compiled function for the case were CallFunction is needed*/\r
+ void *js_fun;\r
+} GF_DOMHandler;\r
+\r
+\r
+\r
+enum\r
+{\r
+ /*basic DOM events*/\r
+ GF_DOM_EVENT_DOM = 1,\r
+ /*DOM mutation events*/\r
+ GF_DOM_EVENT_MUTATION = 1<<1,\r
+ /*DOM mouse events*/\r
+ GF_DOM_EVENT_MOUSE = 1<<2,\r
+ /*DOM focus events*/\r
+ GF_DOM_EVENT_FOCUS = 1<<3,\r
+ /*DOM key events*/\r
+ GF_DOM_EVENT_KEY = 1<<4,\r
+ /*DOM/SVG/HTML UI events (resize, scroll, ...)*/\r
+ GF_DOM_EVENT_UI = 1<<5,\r
+ /*text events*/\r
+ GF_DOM_EVENT_TEXT = 1<<6,\r
+ /*SVG events*/\r
+ GF_DOM_EVENT_SVG = 1<<7,\r
+ /*SMIL events*/\r
+ GF_DOM_EVENT_SMIL = 1<<8,\r
+ /*LASeR events*/\r
+ GF_DOM_EVENT_LASER = 1<<9,\r
+ /*MediaAccess events*/\r
+ GF_DOM_EVENT_MEDIA_ACCESS = 1<<10,\r
+\r
+ /*fake events - these events are NEVER fired*/\r
+ GF_DOM_EVENT_FAKE = 1<<31,\r
+};\r
+u32 gf_dom_event_get_category(u32 type);\r
+u32 gf_sg_get_dom_event_filter(GF_SceneGraph *sg);\r
+u32 gf_node_get_dom_event_filter(GF_Node *node);\r
+\r
+void gf_sg_register_event_type(GF_SceneGraph *sg, u32 type);\r
+void gf_sg_unregister_event_type(GF_SceneGraph *sg, u32 type);\r
+\r
+/*adds a listener to the node.\r
+The listener node is NOT registered with the node (it may very well not be a direct child of the node)\r
+@listener is a listenerElement (XML event)\r
+*/\r
+GF_Err gf_node_dom_listener_add(GF_Node *node, GF_Node *listener);\r
+u32 gf_dom_listener_count(GF_Node *node);\r
+GF_Node *gf_dom_listener_get(GF_Node *node, u32 i);\r
+\r
+/*creates a default listener/handler for the given event on the given node, and return the \r
+handler element to allow for handler function override\r
+Listener/handler are stored at the node level*/\r
+GF_DOMHandler *gf_dom_listener_build(GF_Node *observer, u32 event_type, u32 event_param);\r
+\r
+\r
+void gf_node_register_iri(GF_SceneGraph *sg, XMLRI *iri);\r
+void gf_node_unregister_iri(GF_SceneGraph *sg, XMLRI *iri);\r
+u32 gf_node_animation_count(GF_Node *node);\r
+\r
+GF_Err gf_node_store_embedded_data(XMLRI *iri, const char *cache_dir, const char *base_filename);\r
+\r
+\r
+/**************************************************\r
+ * SVG's styling properties (see 6.1 in REC 1.1) *\r
+ *************************************************/\r
+\r
+typedef struct {\r
+ /* Tiny 1.2 properties*/\r
+ SVG_Paint *color;\r
+ SVG_Paint *fill; \r
+ SVG_Paint *stroke;\r
+ SVG_Paint *solid_color;\r
+ SVG_Paint *stop_color;\r
+ SVG_Paint *viewport_fill;\r
+\r
+ SVG_Number *fill_opacity;\r
+ SVG_Number *solid_opacity;\r
+ SVG_Number *stop_opacity;\r
+ SVG_Number *stroke_opacity;\r
+ SVG_Number *viewport_fill_opacity;\r
+ SVG_Number *opacity; /* Restricted property in Tiny 1.2 */\r
+\r
+ SVG_Number *audio_level;\r
+ Fixed computed_audio_level;\r
+\r
+ SVG_RenderingHint *color_rendering;\r
+ SVG_RenderingHint *image_rendering;\r
+ SVG_RenderingHint *shape_rendering;\r
+ SVG_RenderingHint *text_rendering;\r
+\r
+ SVG_Display *display; \r
+ SVG_Visibility *visibility;\r
+ SVG_Overflow *overflow; /* Restricted property in Tiny 1.2 */\r
+ \r
+ SVG_FontFamily *font_family;\r
+ SVG_FontSize *font_size;\r
+ SVG_FontStyle *font_style; \r
+ SVG_FontWeight *font_weight; \r
+ SVG_FontVariant *font_variant; \r
+ SVG_Number *line_increment; \r
+ SVG_TextAnchor *text_anchor;\r
+ SVG_DisplayAlign *display_align;\r
+ SVG_TextAlign *text_align;\r
+\r
+ SVG_PointerEvents *pointer_events;\r
+ \r
+ SVG_FillRule *fill_rule; \r
+ \r
+ SVG_StrokeDashArray *stroke_dasharray;\r
+ SVG_Length *stroke_dashoffset;\r
+ SVG_StrokeLineCap *stroke_linecap; \r
+ SVG_StrokeLineJoin *stroke_linejoin; \r
+ SVG_Number *stroke_miterlimit; \r
+ SVG_Length *stroke_width;\r
+ SVG_VectorEffect *vector_effect;\r
+ \r
+ /* Full 1.1 props, i.e. not implemented */\r
+/*\r
+ SVG_String *font;\r
+ SVG_String *font_size_adjust;\r
+ SVG_String *font_stretch;\r
+ SVG_String *direction;\r
+ SVG_String *letter_spacing;\r
+ SVG_String *text_decoration;\r
+ SVG_String *unicode_bidi;\r
+ SVG_String *word_spacing;\r
+ SVG_String *clip; \r
+ SVG_String *cursor;\r
+ SVG_String *clip_path;\r
+ SVG_String *clip_rule;\r
+ SVG_String *mask;\r
+ SVG_String *enable_background;\r
+ SVG_String *filter;\r
+ SVG_String *flood_color;\r
+ SVG_String *flood_opacity;\r
+ SVG_String *lighting_color;\r
+ SVG_String *color_interpolation;\r
+ SVG_String *color_interpolation_filters;\r
+ SVG_String *color_profile;\r
+ SVG_String *marker;\r
+ SVG_String *marker_end;\r
+ SVG_String *marker_mid;\r
+ SVG_String *marker_start;\r
+ SVG_String *alignment_baseline;\r
+ SVG_String *baseline_shift;\r
+ SVG_String *dominant_baseline;\r
+ SVG_String *glyph_orientation_horizontal;\r
+ SVG_String *glyph_orientation_vertical;\r
+ SVG_String *kerning;\r
+ SVG_String *writing_mode;\r
+*/\r
+} SVGPropertiesPointers;\r
+\r
+/*************************************\r
+ * Generic SVG element functions *\r
+ *************************************/\r
+\r
+void gf_svg_properties_init_pointers(SVGPropertiesPointers *svg_props);\r
+void gf_svg_properties_reset_pointers(SVGPropertiesPointers *svg_props);\r
+\r
+void gf_svg_apply_animations(GF_Node *node, SVGPropertiesPointers *render_svg_props);\r
+Bool gf_svg_has_appearance_flag_dirty(u32 flags);\r
+\r
+Bool gf_svg_is_element_transformable(u32 tag);\r
+\r
+void *gf_svg_create_attribute_value(u32 attribute_type);\r
+void gf_svg_delete_attribute_value(u32 type, void *value, GF_SceneGraph *sg);\r
+/* a == b */\r
+Bool gf_svg_attributes_equal(GF_FieldInfo *a, GF_FieldInfo *b);\r
+/* a = b */\r
+GF_Err gf_svg_attributes_copy(GF_FieldInfo *a, GF_FieldInfo *b, Bool clamp);\r
+/* c = a + b */\r
+GF_Err gf_svg_attributes_add(GF_FieldInfo *a, GF_FieldInfo *b, GF_FieldInfo *c, Bool clamp);\r
+Bool gf_svg_attribute_is_interpolatable(u32 type) ;\r
+/* c = coef * a + (1 - coef) * b */\r
+GF_Err gf_svg_attributes_interpolate(GF_FieldInfo *a, GF_FieldInfo *b, GF_FieldInfo *c, Fixed coef, Bool clamp);\r
+/* c = alpha * a + beta * b */\r
+GF_Err gf_svg_attributes_muladd(Fixed alpha, GF_FieldInfo *a, Fixed beta, GF_FieldInfo *b, GF_FieldInfo *c, Bool clamp);\r
+\r
+GF_Err gf_node_get_attribute_by_tag(GF_Node *node, u32 attribute_tag, Bool create_if_not_found, Bool set_default, GF_FieldInfo *field);\r
+\r
+char *gf_svg_attribute_type_to_string(u32 att_type);\r
+GF_Err gf_svg_parse_attribute(GF_Node *n, GF_FieldInfo *info, char *attribute_content, u8 anim_value_type);\r
+void gf_svg_parse_style(GF_Node *n, char *style);\r
+\r
+GF_Err gf_svg_dump_attribute(GF_Node *elt, GF_FieldInfo *info, char *attValue);\r
+GF_Err gf_svg_dump_attribute_indexed(GF_Node *elt, GF_FieldInfo *info, char *attValue);\r
+\r
+void gf_svg_path_build(GF_Path *path, GF_List *commands, GF_List *points);\r
+\r
+GF_Err gf_svg_parse_element_id(GF_Node *n, const char *nodename, Bool warning_if_defined);\r
+\r
+const char *gf_svg_get_system_paint_server_name(u32 paint_type);\r
+u32 gf_svg_get_system_paint_server_type(const char *name);\r
+\r
+\r
+Bool gf_smil_notify_timed_elements(GF_SceneGraph *sg);\r
+void gf_smil_timing_insert_clock(GF_Node *elt, Bool is_end, Double clock);\r
+\r
+void gf_svg_parse_transformlist(GF_Matrix2D *mat, char *attribute_content);\r
+\r
+typedef struct _smil_timing_rti SMIL_Timing_RTI;\r
+\r
+enum\r
+{\r
+ SMIL_TIMING_EVAL_NONE = 0,\r
+ SMIL_TIMING_EVAL_UPDATE,\r
+ SMIL_TIMING_EVAL_FREEZE,\r
+ SMIL_TIMING_EVAL_REMOVE,\r
+ SMIL_TIMING_EVAL_REPEAT,\r
+ SMIL_TIMING_EVAL_FRACTION,\r
+ SMIL_TIMING_EVAL_DISCARD,\r
+ /*signaled the animation element has been inserted in the DOM tree*/\r
+ SMIL_TIMING_EVAL_ACTIVATE,\r
+ /*signaled the animation element has been removed from the DOM tree*/\r
+ SMIL_TIMING_EVAL_DEACTIVATE,\r
+};\r
+\r
+void gf_smil_set_evaluation_callback(GF_Node *smil_time, \r
+ void (*smil_evaluate)(struct _smil_timing_rti *rti, Fixed normalized_simple_time, u32 state));\r
+\r
+void gf_smil_set_media_duration(SMIL_Timing_RTI *rti, Double media_duration);\r
+Double gf_smil_get_media_duration(SMIL_Timing_RTI *rti);\r
+GF_Node *gf_smil_get_element(SMIL_Timing_RTI *rti);\r
+\r
+Bool gf_smil_timing_is_active(GF_Node *node);\r
+void gf_smil_timing_modified(GF_Node *node, GF_FieldInfo *field);\r
+\r
+/*******************************************************************************\r
+ * \r
+ * SVG Scene Graph for dynamic allocation of attributes *\r
+ *\r
+ *******************************************************************************/\r
+\r
+/*SVG attributes are just DOM ones*/\r
+typedef struct __dom_base_attribute SVGAttribute;\r
+typedef struct __dom_full_attribute SVGExtendedAttribute;\r
+typedef struct __dom_base_node SVG_Element;\r
+\r
+typedef struct __xml_ev_handler SVG_handlerElement;\r
+\r
+\r
+typedef struct _all_atts SVGAllAttributes;\r
+\r
+void gf_svg_flatten_attributes(SVG_Element *e, SVGAllAttributes *all_atts);\r
+const char *gf_svg_get_attribute_name(GF_Node *elt, u32 tag);\r
+u32 gf_svg_apply_inheritance(SVGAllAttributes *all_atts, SVGPropertiesPointers *render_svg_props) ;\r
+\r
+GF_DOMAttribute *gf_xml_create_attribute(GF_Node *node, u32 tag);\r
+u32 gf_xml_get_attribute_type(u32 tag);\r
+u32 gf_xml_get_attribute_tag(GF_Node *node, char *attribute_name, u32 ns);\r
+\r
+u32 gf_xml_get_element_tag(const char *element_name, u32 xmlns);\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif //_GF_SG_SVG_H_\r