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