2 * GPAC - Multimedia Framework C SDK
\r
4 * Copyright (c) Cyril Concolato 2004
\r
5 * All rights reserved
\r
7 * This file is part of GPAC / SVG Scene Graph sub-project
\r
9 * GPAC is free software; you can redistribute it and/or modify
\r
10 * it under the terms of the GNU Lesser General Public License as published by
\r
11 * the Free Software Foundation; either version 2, or (at your option)
\r
12 * any later version.
\r
14 * GPAC is distributed in the hope that it will be useful,
\r
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 * GNU Lesser General Public License for more details.
\r
19 * You should have received a copy of the GNU Lesser General Public
\r
20 * License along with this library; see the file COPYING. If not, write to
\r
21 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
\r
25 #ifndef _GF_SG_SVG_H_
\r
26 #define _GF_SG_SVG_H_
\r
32 #include <gpac/scenegraph.h>
\r
33 #include <gpac/svg_types.h>
\r
35 /*******************************************************************************
\r
37 * DOM base scene graph
\r
39 *******************************************************************************/
\r
43 /*should never be used, this is only a parsing error*/
\r
44 TAG_DOM_ATTRIBUTE_NULL,
\r
45 /*this tag is set for a full dom attribute only - attribute name is then available*/
\r
48 TAG_XML_ATT_RANGE_FIRST,
\r
49 TAG_XML_ATT_id = TAG_XML_ATT_RANGE_FIRST,
\r
53 TAG_XML_ATT_RANGE_LAST,
\r
54 TAG_XLINK_ATT_RANGE_FIRST,
\r
56 TAG_XLINK_ATT_type = TAG_XLINK_ATT_RANGE_FIRST,
\r
58 TAG_XLINK_ATT_arcrole,
\r
59 TAG_XLINK_ATT_title,
\r
62 TAG_XLINK_ATT_actuate,
\r
63 TAG_XLINK_ATT_RANGE_LAST,
\r
65 TAG_XMLEV_ATT_RANGE_FIRST,
\r
66 TAG_XMLEV_ATT_event,
\r
67 TAG_XMLEV_ATT_phase,
\r
68 TAG_XMLEV_ATT_propagate,
\r
69 TAG_XMLEV_ATT_defaultAction,
\r
70 TAG_XMLEV_ATT_observer,
\r
71 TAG_XMLEV_ATT_target,
\r
72 TAG_XMLEV_ATT_handler,
\r
73 TAG_XMLEV_ATT_RANGE_LAST,
\r
75 TAG_LSR_ATT_RANGE_FIRST,
\r
76 TAG_LSR_ATT_enabled,
\r
77 TAG_LSR_ATT_RANGE_LAST,
\r
78 /*these attribute types are only use for binary purpose*/
\r
79 TAG_LSR_ATT_children,
\r
80 TAG_LSR_ATT_overflow,
\r
81 TAG_LSR_ATT_rotation,
\r
83 TAG_LSR_ATT_translation,
\r
84 TAG_LSR_ATT_svg_width,
\r
85 TAG_LSR_ATT_svg_height,
\r
86 TAG_LSR_ATT_textContent,
\r
87 /*WHAT THE HECK IS THIS THING IN THE SDL BUT NOWHERE IN THE SPEC ?*/
\r
88 TAG_LSR_ATT_text_display,
\r
90 TAG_SVG_ATT_RANGE_FIRST,
\r
92 TAG_XBL_ATT_RANGE_FIRST = TAG_SVG_ATT_RANGE_FIRST + 256,
\r
93 TAG_XBL_ATT_id = TAG_XBL_ATT_RANGE_FIRST,
\r
94 TAG_XBL_ATT_extends,
\r
95 TAG_XBL_ATT_display,
\r
96 TAG_XBL_ATT_inheritstyle,
\r
97 TAG_XBL_ATT_includes,
\r
99 TAG_XBL_ATT_implements,
\r
101 TAG_XBL_ATT_readonly,
\r
105 TAG_XBL_ATT_action,
\r
107 TAG_XBL_ATT_button,
\r
108 TAG_XBL_ATT_modifiers,
\r
109 TAG_XBL_ATT_keycode,
\r
111 TAG_XBL_ATT_charcode,
\r
112 TAG_XBL_ATT_clickcount,
\r
113 TAG_XBL_ATT_command,
\r
114 TAG_XBL_ATT_preventdefault,
\r
119 #define GF_DOM_BASE_ATTRIBUTE \
\r
120 u16 tag; /*attribute identifier*/ \
\r
121 u16 data_type; /*attribute datatype*/ \
\r
122 void *data; /*data pointer*/ \
\r
123 struct __dom_base_attribute *next; /*next attribute*/
\r
125 #define GF_DOM_FULL_ATTRIBUTE \
\r
128 typedef struct __dom_base_attribute
\r
130 GF_DOM_BASE_ATTRIBUTE
\r
133 typedef struct __dom_full_attribute
\r
135 GF_DOM_BASE_ATTRIBUTE
\r
137 char *name; /*attribute name - in this case, the data field is the attribute literal value*/
\r
138 } GF_DOMFullAttribute;
\r
140 #define GF_DOM_BASE_NODE \
\r
143 GF_DOMAttribute *attributes;
\r
145 typedef struct __dom_base_node
\r
150 typedef struct __dom_full_node
\r
161 /*no NS specified, it will be evaluated from attribute/node name*/
\r
171 /*any other namespace uses the CRC32 of the namespace as an identifier*/
\r
174 GF_Err gf_sg_add_namespace(GF_SceneGraph *sg, char *name, char *qname);
\r
175 GF_Err gf_sg_remove_namespace(GF_SceneGraph *sg, char *name, char *qname);
\r
176 u32 gf_sg_get_namespace_code(GF_SceneGraph *sg, char *qname);
\r
177 u32 gf_sg_get_namespace_code_from_name(GF_SceneGraph *sg, char *name);
\r
178 const char *gf_sg_get_namespace_qname(GF_SceneGraph *sg, u32 xmlns_id);
\r
180 u32 gf_xml_get_element_namespace(GF_Node *n);
\r
181 const char *gf_sg_get_namespace(GF_SceneGraph *sg, u32 xmlns_id);
\r
183 void gf_xml_push_namespaces(GF_DOMNode *elt);
\r
184 void gf_xml_pop_namespaces(GF_DOMNode *elt);
\r
191 GF_DOM_TEXT_REGULAR = 0,
\r
193 /*inserted text node (typically external script)*/
\r
194 GF_DOM_TEXT_INSERTED
\r
205 /*creates a new text node, assign string (does NOT duplicate it) and register node with parent if desired*/
\r
206 GF_DOMText *gf_dom_add_text_node(GF_Node *parent, char *text_data);
\r
208 /*creates a new text node - this DOES NOT register the node at all*/
\r
209 GF_DOMText *gf_dom_new_text_node(GF_SceneGraph *sg);
\r
220 /*creates a new updates node and register node with parent*/
\r
221 GF_DOMUpdates *gf_dom_add_updates_node(GF_Node *parent);
\r
227 Fixed remaining_time;
\r
229 const char *session_name;
\r
231 struct mae_item {u32 streamType; u32 mediaType; u32 transport; } streams[20];
\r
232 } GF_DOMMediaAccessEvent;
\r
239 GF_DOM_EVENT_PHASE_CAPTURE = 1,
\r
240 GF_DOM_EVENT_PHASE_AT_TARGET = 2,
\r
241 GF_DOM_EVENT_PHASE_BUBBLE = 3,
\r
243 /*special phase indicating the event has been canceled*/
\r
244 GF_DOM_EVENT_PHASE_CANCEL = 1<<5,
\r
245 /*special phase indicating the event has been canceled immediately*/
\r
246 GF_DOM_EVENT_PHASE_CANCEL_ALL = 1<<6,
\r
247 /*special phase indicating the default action of the event is prevented*/
\r
248 GF_DOM_EVENT_PHASE_PREVENT = 1<<7,
\r
251 /*possible event targets*/
\r
255 GF_DOM_EVENT_DOCUMENT,
\r
257 GF_DOM_EVENT_TIMER,
\r
258 GF_DOM_EVENT_CONNECTION,
\r
266 } GF_DOMEventTarget;
\r
268 GF_Err gf_dom_listener_add(GF_Node *listener, GF_DOMEventTarget *evt_target);
\r
273 /*event type, as defined in <gpac/events.h>*/
\r
275 /*event phase type, READ-ONLY
\r
276 0: at target, 1: bubbling, 2: capturing , 3: canceled
\r
281 /*output only - indicates UI events (mouse) have been detected*/
\r
284 /*we don't use a GF_DOMEventTarget here since the structure is only created when events are attached */
\r
288 GF_DOMEventTarget *currentTarget;
\r
290 /*UIEvent extension.
\r
291 For mouse extensions: number of clicks
\r
292 For key event: the key code
\r
293 For SMIL event: number of iteration (repeat)
\r
297 /*MouseEvent extension*/
\r
298 s32 screenX, screenY;
\r
299 s32 clientX, clientY;
\r
303 /*key hardware code*/
\r
305 GF_Node *relatedTarget;
\r
307 GF_Rect screen_rect;
\r
308 GF_Point2D prev_translate, new_translate;
\r
309 Fixed prev_scale, new_scale;
\r
311 u32 cpu_percentage;
\r
314 u32 batteryState, batteryLevel;
\r
315 /*smil event time*/
\r
316 Double smil_event_time;
\r
317 /* mutation event */
\r
318 GF_Node *relatedNode;
\r
320 /*DOM event used in VRML (GPAC's internal)*/
\r
322 GF_DOMMediaAccessEvent *mae;
\r
324 /*number of listeners triggered by the event*/
\r
328 /*fires event on the specified node
\r
329 BE CAREFULL: event execution may very well destroy ANY node, especially the event target node !!
\r
331 Bool gf_dom_event_fire(GF_Node *node, GF_DOM_Event *event);
\r
333 /*fires event on the specified node
\r
334 BE CAREFULL: event execution may very well destroy ANY node, especially the event target node !!
\r
335 use_stack: a list of parent node/use node pairs for bubbling phase - may be NULL
\r
337 Bool gf_dom_event_fire_ex(GF_Node *node, GF_DOM_Event *event, GF_List *use_stack);
\r
339 u32 gf_dom_event_type_by_name(const char *name);
\r
340 const char *gf_dom_event_get_name(u32 type);
\r
342 const char *gf_dom_get_key_name(u32 key_identifier);
\r
343 u32 gf_dom_get_key_type(char *key_name);
\r
346 /*listener is simply a node added to the node events list.
\r
347 Only one observer can be attached to a listener. The listener will remove itself from the observer
\r
348 event list when destructed.*/
\r
350 typedef struct __xml_ev_handler
\r
353 void (*handle_event)(GF_Node *hdl, GF_DOM_Event *event, GF_Node *observer);
\r
354 /*if handler targets a VRML script, point to the script here*/
\r
356 /*target EventListener object (this) */
\r
357 void *evt_listen_obj;
\r
358 /*function value for spidermonkey - we cannot use JS_CallFunction since it does not work on closures
\r
359 we use 64 bits to store the value for portability safety*/
\r
361 /*compiled function for the case were CallFunction is needed*/
\r
369 /*basic DOM events*/
\r
370 GF_DOM_EVENT_DOM = 1,
\r
371 /*DOM mutation events*/
\r
372 GF_DOM_EVENT_MUTATION = 1<<1,
\r
373 /*DOM mouse events*/
\r
374 GF_DOM_EVENT_MOUSE = 1<<2,
\r
375 /*DOM focus events*/
\r
376 GF_DOM_EVENT_FOCUS = 1<<3,
\r
378 GF_DOM_EVENT_KEY = 1<<4,
\r
379 /*DOM/SVG/HTML UI events (resize, scroll, ...)*/
\r
380 GF_DOM_EVENT_UI = 1<<5,
\r
382 GF_DOM_EVENT_TEXT = 1<<6,
\r
384 GF_DOM_EVENT_SVG = 1<<7,
\r
386 GF_DOM_EVENT_SMIL = 1<<8,
\r
388 GF_DOM_EVENT_LASER = 1<<9,
\r
389 /*MediaAccess events*/
\r
390 GF_DOM_EVENT_MEDIA_ACCESS = 1<<10,
\r
392 /*fake events - these events are NEVER fired*/
\r
393 GF_DOM_EVENT_FAKE = 1<<31,
\r
395 u32 gf_dom_event_get_category(u32 type);
\r
396 u32 gf_sg_get_dom_event_filter(GF_SceneGraph *sg);
\r
397 u32 gf_node_get_dom_event_filter(GF_Node *node);
\r
399 void gf_sg_register_event_type(GF_SceneGraph *sg, u32 type);
\r
400 void gf_sg_unregister_event_type(GF_SceneGraph *sg, u32 type);
\r
402 /*adds a listener to the node.
\r
403 The listener node is NOT registered with the node (it may very well not be a direct child of the node)
\r
404 @listener is a listenerElement (XML event)
\r
406 GF_Err gf_node_dom_listener_add(GF_Node *node, GF_Node *listener);
\r
407 u32 gf_dom_listener_count(GF_Node *node);
\r
408 GF_Node *gf_dom_listener_get(GF_Node *node, u32 i);
\r
410 /*creates a default listener/handler for the given event on the given node, and return the
\r
411 handler element to allow for handler function override
\r
412 Listener/handler are stored at the node level*/
\r
413 GF_DOMHandler *gf_dom_listener_build(GF_Node *observer, u32 event_type, u32 event_param);
\r
416 void gf_node_register_iri(GF_SceneGraph *sg, XMLRI *iri);
\r
417 void gf_node_unregister_iri(GF_SceneGraph *sg, XMLRI *iri);
\r
418 u32 gf_node_animation_count(GF_Node *node);
\r
420 GF_Err gf_node_store_embedded_data(XMLRI *iri, const char *cache_dir, const char *base_filename);
\r
423 /**************************************************
\r
424 * SVG's styling properties (see 6.1 in REC 1.1) *
\r
425 *************************************************/
\r
428 /* Tiny 1.2 properties*/
\r
432 SVG_Paint *solid_color;
\r
433 SVG_Paint *stop_color;
\r
434 SVG_Paint *viewport_fill;
\r
436 SVG_Number *fill_opacity;
\r
437 SVG_Number *solid_opacity;
\r
438 SVG_Number *stop_opacity;
\r
439 SVG_Number *stroke_opacity;
\r
440 SVG_Number *viewport_fill_opacity;
\r
441 SVG_Number *opacity; /* Restricted property in Tiny 1.2 */
\r
443 SVG_Number *audio_level;
\r
444 Fixed computed_audio_level;
\r
446 SVG_RenderingHint *color_rendering;
\r
447 SVG_RenderingHint *image_rendering;
\r
448 SVG_RenderingHint *shape_rendering;
\r
449 SVG_RenderingHint *text_rendering;
\r
451 SVG_Display *display;
\r
452 SVG_Visibility *visibility;
\r
453 SVG_Overflow *overflow; /* Restricted property in Tiny 1.2 */
\r
455 SVG_FontFamily *font_family;
\r
456 SVG_FontSize *font_size;
\r
457 SVG_FontStyle *font_style;
\r
458 SVG_FontWeight *font_weight;
\r
459 SVG_FontVariant *font_variant;
\r
460 SVG_Number *line_increment;
\r
461 SVG_TextAnchor *text_anchor;
\r
462 SVG_DisplayAlign *display_align;
\r
463 SVG_TextAlign *text_align;
\r
465 SVG_PointerEvents *pointer_events;
\r
467 SVG_FillRule *fill_rule;
\r
469 SVG_StrokeDashArray *stroke_dasharray;
\r
470 SVG_Length *stroke_dashoffset;
\r
471 SVG_StrokeLineCap *stroke_linecap;
\r
472 SVG_StrokeLineJoin *stroke_linejoin;
\r
473 SVG_Number *stroke_miterlimit;
\r
474 SVG_Length *stroke_width;
\r
475 SVG_VectorEffect *vector_effect;
\r
477 /* Full 1.1 props, i.e. not implemented */
\r
480 SVG_String *font_size_adjust;
\r
481 SVG_String *font_stretch;
\r
482 SVG_String *direction;
\r
483 SVG_String *letter_spacing;
\r
484 SVG_String *text_decoration;
\r
485 SVG_String *unicode_bidi;
\r
486 SVG_String *word_spacing;
\r
488 SVG_String *cursor;
\r
489 SVG_String *clip_path;
\r
490 SVG_String *clip_rule;
\r
492 SVG_String *enable_background;
\r
493 SVG_String *filter;
\r
494 SVG_String *flood_color;
\r
495 SVG_String *flood_opacity;
\r
496 SVG_String *lighting_color;
\r
497 SVG_String *color_interpolation;
\r
498 SVG_String *color_interpolation_filters;
\r
499 SVG_String *color_profile;
\r
500 SVG_String *marker;
\r
501 SVG_String *marker_end;
\r
502 SVG_String *marker_mid;
\r
503 SVG_String *marker_start;
\r
504 SVG_String *alignment_baseline;
\r
505 SVG_String *baseline_shift;
\r
506 SVG_String *dominant_baseline;
\r
507 SVG_String *glyph_orientation_horizontal;
\r
508 SVG_String *glyph_orientation_vertical;
\r
509 SVG_String *kerning;
\r
510 SVG_String *writing_mode;
\r
512 } SVGPropertiesPointers;
\r
514 /*************************************
\r
515 * Generic SVG element functions *
\r
516 *************************************/
\r
518 void gf_svg_properties_init_pointers(SVGPropertiesPointers *svg_props);
\r
519 void gf_svg_properties_reset_pointers(SVGPropertiesPointers *svg_props);
\r
521 void gf_svg_apply_animations(GF_Node *node, SVGPropertiesPointers *render_svg_props);
\r
522 Bool gf_svg_has_appearance_flag_dirty(u32 flags);
\r
524 Bool gf_svg_is_element_transformable(u32 tag);
\r
526 void *gf_svg_create_attribute_value(u32 attribute_type);
\r
527 void gf_svg_delete_attribute_value(u32 type, void *value, GF_SceneGraph *sg);
\r
529 Bool gf_svg_attributes_equal(GF_FieldInfo *a, GF_FieldInfo *b);
\r
531 GF_Err gf_svg_attributes_copy(GF_FieldInfo *a, GF_FieldInfo *b, Bool clamp);
\r
533 GF_Err gf_svg_attributes_add(GF_FieldInfo *a, GF_FieldInfo *b, GF_FieldInfo *c, Bool clamp);
\r
534 Bool gf_svg_attribute_is_interpolatable(u32 type) ;
\r
535 /* c = coef * a + (1 - coef) * b */
\r
536 GF_Err gf_svg_attributes_interpolate(GF_FieldInfo *a, GF_FieldInfo *b, GF_FieldInfo *c, Fixed coef, Bool clamp);
\r
537 /* c = alpha * a + beta * b */
\r
538 GF_Err gf_svg_attributes_muladd(Fixed alpha, GF_FieldInfo *a, Fixed beta, GF_FieldInfo *b, GF_FieldInfo *c, Bool clamp);
\r
540 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
542 char *gf_svg_attribute_type_to_string(u32 att_type);
\r
543 GF_Err gf_svg_parse_attribute(GF_Node *n, GF_FieldInfo *info, char *attribute_content, u8 anim_value_type);
\r
544 void gf_svg_parse_style(GF_Node *n, char *style);
\r
546 GF_Err gf_svg_dump_attribute(GF_Node *elt, GF_FieldInfo *info, char *attValue);
\r
547 GF_Err gf_svg_dump_attribute_indexed(GF_Node *elt, GF_FieldInfo *info, char *attValue);
\r
549 void gf_svg_path_build(GF_Path *path, GF_List *commands, GF_List *points);
\r
551 GF_Err gf_svg_parse_element_id(GF_Node *n, const char *nodename, Bool warning_if_defined);
\r
553 const char *gf_svg_get_system_paint_server_name(u32 paint_type);
\r
554 u32 gf_svg_get_system_paint_server_type(const char *name);
\r
557 Bool gf_smil_notify_timed_elements(GF_SceneGraph *sg);
\r
558 void gf_smil_timing_insert_clock(GF_Node *elt, Bool is_end, Double clock);
\r
560 void gf_svg_parse_transformlist(GF_Matrix2D *mat, char *attribute_content);
\r
562 typedef struct _smil_timing_rti SMIL_Timing_RTI;
\r
566 SMIL_TIMING_EVAL_NONE = 0,
\r
567 SMIL_TIMING_EVAL_UPDATE,
\r
568 SMIL_TIMING_EVAL_FREEZE,
\r
569 SMIL_TIMING_EVAL_REMOVE,
\r
570 SMIL_TIMING_EVAL_REPEAT,
\r
571 SMIL_TIMING_EVAL_FRACTION,
\r
572 SMIL_TIMING_EVAL_DISCARD,
\r
573 /*signaled the animation element has been inserted in the DOM tree*/
\r
574 SMIL_TIMING_EVAL_ACTIVATE,
\r
575 /*signaled the animation element has been removed from the DOM tree*/
\r
576 SMIL_TIMING_EVAL_DEACTIVATE,
\r
579 void gf_smil_set_evaluation_callback(GF_Node *smil_time,
\r
580 void (*smil_evaluate)(struct _smil_timing_rti *rti, Fixed normalized_simple_time, u32 state));
\r
582 void gf_smil_set_media_duration(SMIL_Timing_RTI *rti, Double media_duration);
\r
583 Double gf_smil_get_media_duration(SMIL_Timing_RTI *rti);
\r
584 GF_Node *gf_smil_get_element(SMIL_Timing_RTI *rti);
\r
586 Bool gf_smil_timing_is_active(GF_Node *node);
\r
587 void gf_smil_timing_modified(GF_Node *node, GF_FieldInfo *field);
\r
589 /*******************************************************************************
\r
591 * SVG Scene Graph for dynamic allocation of attributes *
\r
593 *******************************************************************************/
\r
595 /*SVG attributes are just DOM ones*/
\r
596 typedef struct __dom_base_attribute SVGAttribute;
\r
597 typedef struct __dom_full_attribute SVGExtendedAttribute;
\r
598 typedef struct __dom_base_node SVG_Element;
\r
600 typedef struct __xml_ev_handler SVG_handlerElement;
\r
603 typedef struct _all_atts SVGAllAttributes;
\r
605 void gf_svg_flatten_attributes(SVG_Element *e, SVGAllAttributes *all_atts);
\r
606 const char *gf_svg_get_attribute_name(GF_Node *elt, u32 tag);
\r
607 u32 gf_svg_apply_inheritance(SVGAllAttributes *all_atts, SVGPropertiesPointers *render_svg_props) ;
\r
609 GF_DOMAttribute *gf_xml_create_attribute(GF_Node *node, u32 tag);
\r
610 u32 gf_xml_get_attribute_type(u32 tag);
\r
611 u32 gf_xml_get_attribute_tag(GF_Node *node, char *attribute_name, u32 ns);
\r
613 u32 gf_xml_get_element_tag(const char *element_name, u32 xmlns);
\r
620 #endif //_GF_SG_SVG_H_
\r